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

GIS开发 专栏收录该内容
1 篇文章 0 订阅

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

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

一、设置导入库


参考网址:

设置导入库是为了应用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授权

参考资料

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

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

#if _WIN32_WINNT >= 0x0400 //对应 Windows NT 4.0
HRESULT hRes = CoInitializeEx (NULL , COINIT_MULTITHREADED );// 当前线程初始化 COM库并设置并发模式
#else
HRESULT 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;

五、附录
  • 0
    点赞
  • 4
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

AllenMap

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值