【基于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。导入方式是在文件下面加入以下语句。
注意事项:
[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]
[align=left]为了保证正确性,定义一个初始化COM的类,自动实现COM的初始化和释放。[/align]
[align=left]2、定义AO初始化对象[/align]
[align=left]3、AO初始化函数[/align]
[align=left]4、资源释放[/align]
[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
[align=left]四、COM编程[/align]
1、接口的定义初始化
2、查询接口
[align=left]五、附录[/align]
[align=left]1、FDO错误代码列表:http://edndoc.esri.com/arcobjects/8.3/ComponentHelp/esriCore/fdoError.htm[/align]
文中的内容主要是基于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]
相关文章推荐
- VC(MFC)以ADO连接数据库(基于控件ListControl)
- 基于Visual Stdio 2010的C++开发数据库基础之ADO数据库连接方法(二)
- RDIFramework.NET — 基于.NET的快速信息化系统开发框架 - 5.3 数据库连接管理模块
- RDIFramework.NET — 基于.NET的快速信息化系统开发框架 - 5.3 数据库连接管理模块
- 基于VC ADO组件连接数据库编程
- java开发中基于JDBC连接数据库实例总结
- 关于VC数据库开发中数据库连接与效率的问题-----一点体会和经验
- Atitit 基于meta的orm,提升加速数据库相关应用的开发
- VC++中使用MFC通过ADO连接数据库方法小结(不包括异常的捕捉
- 更改口令的界面的开发 (VC和数据库应用)
- vc++中ado连接数据库的方法及详细介绍
- 基于GlassFish 的 NetBeans 开发环境下 SQL 2008 数据库访问
- 基于ArcEngine的土地利用规划管理信息系统的研究与开发目录
- ThinkPHP框架基于PDO方式连接数据库操作示例
- VC开发数据库软件中常用的SQL语句
- 开发eclipse插件,连接不上数据库
- 为什么将Qt开发的使用数据库的程序发布到其它机器就连接不上数据库?
- 实现基于WebService上的CrystalReport与数据库连接
- Delphi 开发时运行出现 程序连接数据库错误 在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配
- 完整java开发中JDBC连接数据库代码和步骤