您的位置:首页 > 数据库

【基于VC的ArcEngine开发】1连接数据库

2012-07-31 17:45 405 查看
前面的话:ArcEngine是GIS巨头企业ESRI推出的地理信息系统的二次开发包,满足应用行业快速搭建GIS系统的需求。一般的二次开发使用C#,语言简单,开发者可将更多的精力集中到具体的业务问题的解决,但是也有一些特殊需求,需要基于其他开发语言进行ArcEngine的二次开发。本文也是我第一次基于C++使用ArcEngine的接口连接数据库时搜集资料的一些汇总,希望能给以后的开发者一些方便。

文中的内容主要是基于C++的ArcEngine开发的基本环境的配置和初始化方法,实际的进一步开发中需要开发者了解COM的一些基础特性,开发高级功能需要多多分析ArcEngine的接口。

一、设置导入库

参考网址:
1、/article/1446471.html
2、Importing ArcGIS Type Libraries:http://edndoc.esri.com/arcobjects/9.1/arcgisdevhelp/developmentenvs/com/vcpp/ImportingArcGISTypeLibraries.htm

设置导入库是为了应用ArcEngine对应的库文件,ArcEngine安装后库文件的路径为“*/Program Files/ArcGIS/com/”,库文件的后缀是olb。导入方式是在文件下面加入以下语句。

#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 )


注意事项:
[align=left]1、导入库的顺序按照依赖的先后顺序,即被依赖库在依赖库之前引用。[/align]
[align=left]2、如果报出接口重定义错误,在导入语句后加入exclude("冲突接口")。如果这种方法不能解决,需要重新命名接口,例如,报ISegment接口重定义,那么直接在导入语句的最后加上rename(“ISegment”, “IESRISegment”),这时的接口IESRISegment就是对ISegment的重命名。[/align]
[align=left]3、如果报出没有定义接口,可能是没有引用该接口所在的库或引用库的顺序错误所致。[/align]
[align=left]4、为了避免错误,导入库语句最好放在stdafx.h最后。[/align]

[align=left]二、初始化AE授权[/align]

参考资料
[align=left]1、/article/9677991.html[/align]
[align=left]2、/article/10244823.html[/align]

[align=left]ArcEngine针对不同的用户发布了不同的许可级别,用户根据需要初始化不同的许可级别。这里选择的是最高的级别:esriLicenseProductCodeEngineGeoDB。[/align]

[align=left]1、初始化COM库[/align]
[align=left]采用如下方式可以完成初始化,但是程序结束调用CoUninitialize()时会出现错误。[/align]

#if _WIN32_WINNT >= 0x0400 //对应 Windows NT 4.0
HRESULT hRes = CoInitializeEx (NULL , COINIT_MULTITHREADED );// 当前线程初始化 COM库并设置并发模式
#else
HRESULT hRes = CoInitialize(NULL);// 以单线程的方式创建 com对象
#endif


[align=left]为了保证正确性,定义一个初始化COM的类,自动实现COM的初始化和释放。[/align]

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();
}
};


[align=left]2、定义AO初始化对象[/align]
IAoInitializePtr m_pAoInit ;


[align=left]3、AO初始化函数[/align]
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;
}
}


[align=left]4、资源释放[/align]

void ShutDownAO (){
// 释放 AO
m_pAoInit-> Shutdown();
// 释放 COM
CoUninitialize();
}


[align=left]注意事项:[/align]
[align=left]1、COM库或ArcEngine授权未初始化情况下会报出以下错误:“Microsoft C++ 异常: 内存位置 0x0012ea88 处的 _com_error”[/align]

[align=left]三、连接SDE数据库[/align]

[align=left]参考网址:[/align]
1、Connect
to Enterprise Geodatabase

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);
}


[align=left]四、COM编程[/align]

1、接口的定义初始化

IDatasetNamePtr ipds_name(CLSID_FeatureDatasetName);


2、查询接口

IFeatureWorkspaceManagePtr ipfwsm;
if(S_OK != m_ipworkspace->QueryInterface(&ipfwsm))
return false;


[align=left]五、附录[/align]
[align=left]1、FDO错误代码列表:http://edndoc.esri.com/arcobjects/8.3/ComponentHelp/esriCore/fdoError.htm[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: