【基于VC的ArcEngine开发】1连接数据库
来源:互联网 发布:抓取远程图片PHP函数 编辑:程序博客网 时间:2024/05/03 17:30
前面的话:ArcEngine是GIS巨头企业ESRI推出的地理信息系统的二次开发包,满足应用行业快速搭建GIS系统的需求。一般的二次开发使用C#,语言简单,开发者可将更多的精力集中到具体的业务问题的解决,但是也有一些特殊需求,需要基于其他开发语言进行ArcEngine的二次开发。本文也是我第一次基于C++使用ArcEngine的接口连接数据库时搜集资料的一些汇总,希望能给以后的开发者一些方便。
文中的内容主要是基于C++的ArcEngine开发的基本环境的配置和初始化方法,实际的进一步开发中需要开发者了解COM的一些基础特性,开发高级功能需要多多分析ArcEngine的接口。
一、设置导入库
参考网址:
1、http://blog.csdn.net/jx1228/article/details/1604242
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 )
注意事项:
1、导入库的顺序按照依赖的先后顺序,即被依赖库在依赖库之前引用。
2、如果报出接口重定义错误,在导入语句后加入exclude("冲突接口")。如果这种方法不能解决,需要重新命名接口,例如,报ISegment接口重定义,那么直接在导入语句的最后加上rename(“ISegment”, “IESRISegment”),这时的接口IESRISegment就是对ISegment的重命名。
3、如果报出没有定义接口,可能是没有引用该接口所在的库或引用库的顺序错误所致。
4、为了避免错误,导入库语句最好放在stdafx.h最后。
二、初始化AE授权
参考资料
1、http://blog.csdn.net/gishjl/article/details/2097504
2、http://blog.csdn.net/redbednil/article/details/1657408
ArcEngine针对不同的用户发布了不同的许可级别,用户根据需要初始化不同的许可级别。这里选择的是最高的级别:esriLicenseProductCodeEngineGeoDB。
1、初始化COM库
采用如下方式可以完成初始化,但是程序结束调用CoUninitialize()时会出现错误。
#if _WIN32_WINNT >= 0x0400 //对应 Windows NT 4.0HRESULT hRes = CoInitializeEx (NULL , COINIT_MULTITHREADED );// 当前线程初始化 COM库并设置并发模式#elseHRESULT hRes = CoInitialize(NULL);// 以单线程的方式创建 com对象#endif
为了保证正确性,定义一个初始化COM的类,自动实现COM的初始化和释放。
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(); }};
2、定义AO初始化对象
IAoInitializePtr m_pAoInit ;
3、AO初始化函数
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; }}
4、资源释放
void ShutDownAO (){ // 释放 AO m_pAoInit-> Shutdown(); // 释放 COM CoUninitialize();}
注意事项:
1、COM库或ArcEngine授权未初始化情况下会报出以下错误:“Microsoft C++ 异常: 内存位置 0x0012ea88 处的 _com_error”
三、连接SDE数据库
参考网址:
1、Connect to Enterprise GeodatabaseHRESULT 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);}
四、COM编程
1、接口的定义初始化
IDatasetNamePtr ipds_name(CLSID_FeatureDatasetName);
2、查询接口
IFeatureWorkspaceManagePtr ipfwsm; if(S_OK != m_ipworkspace->QueryInterface(&ipfwsm)) return false;
五、附录
1、FDO错误代码列表:http://edndoc.esri.com/arcobjects/8.3/ComponentHelp/esriCore/fdoError.htm
- 【基于VC的ArcEngine开发】1连接数据库
- 基于ArcEngine开发的ArcGIS特殊符号
- ArcEngine连接数据库ORACLE
- ArcEngine连接数据库SQL
- ArcEngine连接数据库Access
- ArcEngine连接数据库MySQL
- vc++开发ArcEngine中对象实例化的方法
- ArcEngine连接数据库IBM DB2
- VC++ 数据库的连接
- 基于ArcEngine的土地利用规划管理信息系统的研究与开发目录
- C#基于vs2010的ArcEngine开发demo源码
- 基于VC ADO组件连接数据库编程
- vc连接数据库的方法
- vc连接数据库的方法
- 基于ArcEngine的网格计算相关(1)
- 基于Arcengine+C#开发程序重新打开
- 基于ArcEngine开发报错010096
- VC++ 基于Win32控制台应用程序的ADO连接SQL server数据库
- Android之ActionBar详解
- C# double小数点位数保留问题
- 关于Java占用内存的研究
- C#调用WIN API
- Dialog美化之背景透明
- 【基于VC的ArcEngine开发】1连接数据库
- 网页开头部分的声明DOCTYPE
- java.util.ConcurrentModificationException
- 对Java多线程技术中所有方法的详细解析
- Spring3+Struts2+JPA2.0
- 日期在String和Date类型转换
- UI美化之半透明,透明效果
- 关于MD5的个人笔记
- Apache与Tomcat静动态分离