1. 程式人生 > >ArcGIS10.2在VS2010/VS2012/VS2013 下進行二次開發及編譯出錯解決

ArcGIS10.2在VS2010/VS2012/VS2013 下進行二次開發及編譯出錯解決

平臺: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

配置完成如下:


在前處理器中新增:ESRI_WINDOWS,如下:

在工程檔案的stdafx.h標頭檔案中加入#include <ArcSDK.h>

注意:繫結許可和初始化許可,繫結許可是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</span>.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</span>.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</span>.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" )

為:#import "esrigeodatabase.olb" raw_interfaces_only raw_native_types 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")

具體使用操作請參考其他教程。。。。

結果:


謝謝觀看!!!