平台:VS2010、VS2012、VS2013 + ArcGIS 10.2 + Win7 64bit
使用ArcGIS10.2结合MFC进行二次开发,编译出错。
首先配置工程,在工程上右键->属性->c/c++->常规->附加包含目录,添加如下,为本文中Engine、DeveloperKit、C:\Program Files (x86)\Common Files\ArcGIS\bin
C:\Program Files %28x86%29\Common Files\ArcGIS\bin
E:\ArcGIS\DeveloperKit10.2\include\CPPAPI
E:\ArcGIS\Engine10.2\com
配置完成如下:
在工程文件的stdafx.h头文件中加入#include
注意:绑定许可和初始化许可,绑定许可是10.0之后必须的操作
在建立的MFC工程主头文件中添加AEInit()函数,如下:
主cpp文件初始化函数中添加:
代码:
bool CMFCArcGISDialog2App::AEInit()
{
#pragma region
IArcGISVersionPtr ipVer(__uuidof(VersionManager));
VARIANT_BOOL succeeded;
if (FAILED(ipVer->LoadVersion(esriArcGISEngine, L"10.2", &succeeded)))
return false;
#pragma endregion
#pragma region
IAoInitializePtr ipInit(CLSID_AoInitialize);
esriLicenseStatus status;
ipInit->Initialize(esriLicenseProductCodeEngine, &status);
if (status != esriLicenseCheckedOut)
AoExit(0);
return true;
#pragma endregion
}
::CoInitialize(NULL); //这句话非常重要!!!!!!
bool Isok = AEInit();
错误一:
出现错误如下:
1>f:\wps\2016summer\arcgis\vs2010\engine\mfcapp\mfcapp\debug\esrisystemui.tlh(29): error C3121: 无法更改“IProgressDialog”类的 GUID
1> c:\program files (x86)\microsoft sdks\windows\v7.0a\include\shlobj.h(1851) : 参见“IProgressDialog”的声明
1>f:\wps\2016summer\arcgis\vs2010\engine\mfcapp\mfcapp\debug\esrisystemui.tlh(31):error C3121: 无法更改“ICommand”类的 GUID
1> c:\program files (x86)\microsoft sdks\windows\v7.0a\include\oledb.h(6055) : 参见“ICommand”的声明
1>f:\wps\2016summer\arcgis\vs2010\engine\mfcapp\mfcapp\debug\esrisystemui.tlh(200):error C2011: “IProgressDialog”:“struct”类型重定义
1> c:\program files (x86)\microsoft sdks\windows\v7.0a\include\shlobj.h(1851) : 参见“IProgressDialog”的声明
1>f:\wps\2016summer\arcgis\vs2010\engine\mfcapp\mfcapp\debug\esrisystemui.tlh(215):error C2011: “ICommand”:“struct”类型重定义
1> c:\program files (x86)\microsoft sdks\windows\v7.0a\include\oledb.h(6055) : 参见“ICommand”的声明
原因是MFC的接口与ArcGIS之间冲突。
解决方法有两种,一种对接口重命名,另一种使用命名空间+接口名称方法。
方法一:本文ArcGIS DeveloperKit 10.2 安装路径为E:\ArcGIS\DeveloperKit10.2
在E:\ArcGIS\DeveloperKit10.2\include\CPPAPI\olb目录中找到出现报错的头文件esrisystemui.h。
修改:#import "esrisystemui.olb" raw_interfaces_only raw_native_types no_namespace named_guids exclude( "OLE_HANDLE", "OLE_COLOR", "UINT_PTR" )
为:#import "esrisystemui.olb" raw_interfaces_only raw_native_types no_namespace named_guids exclude( "OLE_HANDLE", "OLE_COLOR", "UINT_PTR" )rename("ICommand", "esriICommand") rename("IProgressDialog", "esriIProgressDialog")
切记:一定是进入安装路径修改头文件。我开始在stdafx.h中修改,无法解决问题!!!!!!
方法二:去掉no_namespace,使用命名空间调用接口
修改:#import "esrisystemui.olb" raw_interfaces_only raw_native_types no_namespace named_guids exclude( "OLE_HANDLE", "OLE_COLOR", "UINT_PTR" )
为:#import "esrisystemui.olb" raw_interfaces_only raw_native_types named_guids exclude( "OLE_HANDLE", "OLE_COLOR", "UINT_PTR" )
错误二:
1>f:\wps\2016summer\arcgis\vs2010\engine\mfcapp\mfcapp\debug\esrigeodatabase.tlh(100): error C3121: 无法更改“IRow”类的 GUID
1> c:\program files (x86)\microsoft sdks\windows\v7.0a\include\oledb.h(12853) : 参见“IRow”的声明
1>f:\wps\2016summer\arcgis\vs2010\engine\mfcapp\mfcapp\debug\esrigeodatabase.tlh(20845): error C2011: “IRow”:“struct”类型重定义
1> c:\program files (x86)\microsoft sdks\windows\v7.0a\include\oledb.h(12853) : 参见“IRow”的声明
1>f:\wps\2016summer\arcgis\vs2010\engine\mfcapp\mfcapp\debug\esrigeodatabase.tlh(20862): error C2011: “ICursor”:“struct”类型重定义
1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\ocdb.h(620) : 参见“ICursor”的声明
1>f:\wps\2016summer\arcgis\vs2010\engine\mfcapp\mfcapp\debug\esrigeodatabase.tlh(22350): error C2504: “IRow”: 未定义基类
方法一:本文ArcGIS DeveloperKit 10.2 安装路径为E:\ArcGIS\DeveloperKit10.2
在E:\ArcGIS\DeveloperKit10.2\include\CPPAPI\olb目录中找到出现报错的头文件esrigeodatabase.h。
修改:#import "esrigeodatabase.olb" raw_interfaces_only raw_native_types no_namespace named_guids exclude( "OLE_HANDLE", "OLE_COLOR", "UINT_PTR" )
为:#import "esrigeodatabase.olb" raw_interfaces_only raw_native_types no_namespace named_guids exclude( "OLE_HANDLE", "OLE_COLOR", "UINT_PTR" )rename("IRow", "esriIRow"), rename("ICursor", "esriICursor"), rename("IRelationship", "esriIRelationship")
切记:一定是进入安装路径修改头文件。我开始在stdafx.h中修改,无法解决问题!!!!!!
方法二:去掉no_namespace,使用命名空间调用接口
修改:#import "esrigeodatabase.olb" raw_interfaces_only raw_native_types no_namespace named_guids exclude( "OLE_HANDLE", "OLE_COLOR", "UINT_PTR" )
以此类推。。。
本文在esricarto.h 中添加 rename("ITableDefinition", "esriITableDefinition")
#import "esricarto.olb" raw_interfaces_only raw_native_types no_namespace named_guids exclude( "OLE_HANDLE", "OLE_COLOR", "UINT_PTR" )rename("ITableDefinition", "esriITableDefinition")
具体使用操作请参考其他教程。。。。
结果:
谢谢观看!!!