前面的話:ArcEngine是GIS巨頭企業ESRI推出的地理信息系統的二次開發包,滿足應用行業快速搭建GIS系統的需求。一般的二次開發使用C#,語言簡單,開發者可將更多的精力集中到具體的業務問題的解決,但是也有一些特殊需求,需要基於其他開發語言進行ArcEngine的二次開發。本文也是我第一次基於C++使用ArcEngine的接口連接數據庫時蒐集資料的一些彙總,希望能給以後的開發者一些方便。
文中的內容主要是基於C++的ArcEngine開發的基本環境的配置和初始化方法,實際的進一步開發中需要開發者瞭解COM的一些基礎特性,開發高級功能需要多多分析ArcEngine的接口。
一、設置導入庫
參考網址:
#pragma warning (push )
#pragma warning (disable : 4192) /* Ignore warnings for types that are duplicated in win32 header files */
#pragma warning (disable : 4146) /* Ignore warnings for use of minus on unsigned types */
#pragma warning (disable : 4278) /* Ignore warnings for identifier in type library 'tlb' is already a macro */
#import "D:/Program Files/ArcGIS/com/esriSystem.olb" raw_interfaces_only, raw_native_types , no_namespace , named_guids , exclude("OLE_COLOR" , "OLE_HANDLE" , "VARTYPE" )
#import "D:/Program Files/ArcGIS/com/esriSystemUI.olb" raw_interfaces_only, raw_native_types , no_namespace , named_guids,exclude ("OLE_COLOR" ,"ICommand" ,"IProgressDialog" )
#import "D:/Program Files/ArcGIS/com/esriGeometry.olb" raw_interfaces_only, raw_native_types , no_namespace , named_guids,exclude ("OLE_COLOR" )
#import "D:/Program Files/ArcGIS/com/esriDisplay.olb" raw_interfaces_only, raw_native_types , no_namespace , named_guids,exclude ("OLE_COLOR" )
#import "D:/Program Files/ArcGIS/com/esriOutput.olb" raw_interfaces_only, raw_native_types , no_namespace , named_guids,exclude ("OLE_COLOR" )
#import "D:/Program Files/ArcGIS/com/esriGeoDatabase.olb" raw_interfaces_only, raw_native_types , no_namespace , named_guids,exclude ("OLE_COLOR" ,"ICursor" )
#import "D:/Program Files/ArcGIS/com/esriCarto.olb" raw_interfaces_only , raw_native_types, no_namespace , named_guids,exclude ("OLE_COLOR" ,"ITableDefinition" ,"UINT_PTR" )
#pragma warning (pop )
注意事項:
參考資料
#if _WIN32_WINNT >= 0x0400 //對應 Windows NT 4.0
HRESULT hRes = CoInitializeEx (NULL , COINIT_MULTITHREADED );// 當前線程初始化 COM庫並設置併發模式
#else
HRESULT hRes = CoInitialize(NULL);// 以單線程的方式創建 com對象
#endif
class ComInit
{
public:
ComInit()
{
#if _WIN32_WINNT >= 0x0400 //對應 Windows NT 4.0
HRESULT hRes = CoInitializeEx (NULL , COINIT_MULTITHREADED);//當前線程初始化COM庫並設置併發模式
#else
HRESULT hRes = CoInitialize(NULL);// 以單線程的方式初始化 COM庫
#endif
}
~ ComInit()
{
CoUninitialize();
}
};
IAoInitializePtr m_pAoInit ;
void InitialAO ()
{
esriLicenseStatus lic_status ;
HRESULT hr;
hr = m_pAoInit.CreateInstance (CLSID_AoInitialize );
// 獲取是否支持讀寫許可
m_pAoInit-> IsProductCodeAvailable(esriLicenseProductCodeEngineGeoDB ,&lic_status );
if( lic_status == esriLicenseAvailable)
{
hr = m_pAoInit->Initialize (esriLicenseProductCodeEngineGeoDB ,&lic_status );
}
else
{
// 是否支持只讀許可
m_pAoInit-> IsProductCodeAvailable(esriLicenseProductCodeEngine ,&lic_status );
if( lic_status == esriLicenseAvailable)
{
hr = m_pAoInit->Initialize (esriLicenseProductCodeEngine ,&lic_status );
}
}
if( lic_status != esriLicenseCheckedOut)
{
AfxMessageBox("本機沒有合適的ArcGIS授權,請與管理員聯繫!");
return;
}
}
void ShutDownAO (){
// 釋放 AO
m_pAoInit-> Shutdown();
// 釋放 COM
CoUninitialize();
}
HRESULT connectToSDE (BSTR server ,
BSTR instance,//5151
BSTR user,
BSTR passwd,
BSTR database,
BSTR version,
IWorkspace ** outWorkspace)
{
if (outWorkspace == NULL )
return E_POINTER;
// create the property set for the connection parameters
IPropertySetPtr ipPropertySet ;
HRESULT hr = ipPropertySet .CreateInstance (CLSID_PropertySet );
// configure the propertyset
ipPropertySet->SetProperty (CComBSTR ("SERVER" ), CComVariant(server ));
ipPropertySet->SetProperty (CComBSTR (L "INSTANCE"), CComVariant(instance ));
ipPropertySet->SetProperty (CComBSTR (L "DATABASE"), CComVariant(database ));
ipPropertySet->SetProperty (CComBSTR (L "USER"), CComVariant(user ));
ipPropertySet->SetProperty (CComBSTR (L "PASSWORD"), CComVariant(passwd ));
ipPropertySet->SetProperty (CComBSTR (L "VERSION"), CComVariant(version ));
// open workspace
IWorkspaceFactoryPtr ipWorkspaceFactory ;
ipWorkspaceFactory.CreateInstance (CLSID_SdeWorkspaceFactory );
return ipWorkspaceFactory->Open (ipPropertySet , NULL , outWorkspace);
}
1、接口的定義初始化
IDatasetNamePtr ipds_name(CLSID_FeatureDatasetName);
2、查詢接口
IFeatureWorkspaceManagePtr ipfwsm;
if(S_OK != m_ipworkspace->QueryInterface(&ipfwsm))
return false;