【基于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 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);}

四、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
原创粉丝点击