直接看代码,写在dllmain.cpp中:
// dllmain.cpp : DllMain 的实现。
#include "stdafx.h"
#include "resource.h"
#include "ExportDataToPGDB_i.h"
#include "dllmain.h"
extern CLogger g_logger;
CExportDataToPGDBModule _AtlModule;
class CExportDataToPGDBApp : public CWinApp
{
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
DECLARE_MESSAGE_MAP()
BOOL InitializeLicense(IAoInitializePtr& ipAoInitialize, esriLicenseProductCode product);
BOOL InitializeLicense(IAoInitializePtr& ipAoInitialize, CString& strLicenseProduct);
IAoInitializePtr m_ipAoInitialize;
};
BEGIN_MESSAGE_MAP(CExportDataToPGDBApp, CWinApp)
END_MESSAGE_MAP()
CExportDataToPGDBApp theApp;
BOOL CExportDataToPGDBApp::InitializeLicense(IAoInitializePtr& ipAoInitialize, CString& strLicenseProduct)
{
CString strVerNo, strProduct;
if (SetArcGisVersion(esriArcGISDesktop, strVerNo))
{
strProduct = _T("当前ArcEngine运行环境:ArcGISDesktop");
}
else if (SetArcGisVersion(esriArcGISServer, strVerNo))
{
strProduct = _T("当前ArcEngine运行环境:ArcGISServer");
}
else if (SetArcGisVersion(esriArcGISEngine, strVerNo))
{
strProduct = _T("当前ArcEngine运行环境:ArcGISArcEngine");
}
else if (SetArcGisVersion(esriArcGISReader, strVerNo))
{
strProduct = _T("当前ArcEngine运行环境:ArcGISReader");
}
else if (SetArcGisVersion(esriArcGISExplorer, strVerNo))
{
strProduct = _T("当前ArcEngine运行环境:ArcGISExplorer");
}
else
{
::MessageBox(NULL, _T("Engine版本初始化失败"), _T("错误"), MB_OK | MB_ICONSTOP);
return FALSE;
}
if (NULL == ipAoInitialize)
{
HRESULT hr = ipAoInitialize.CreateInstance(CLSID_AoInitialize);
if (FAILED(hr))
{
return FALSE;
}
}
if (InitializeLicense(ipAoInitialize, esriLicenseProductCodeEngineGeoDB))
{
strLicenseProduct = _T("当前ArcGis产品许可:EngineGeoDB");
}
else if (InitializeLicense(ipAoInitialize, esriLicenseProductCodeArcServer))
{
strLicenseProduct = _T("当前ArcGis产品许可:ArcServer");
}
else if (InitializeLicense(ipAoInitialize, esriLicenseProductCodeEngine))
{
strLicenseProduct = _T("当前ArcGis产品许可:ArcEngine");
}
else
{
return FALSE;
}
return TRUE;
}
BOOL CExportDataToPGDBApp::InitializeLicense(IAoInitializePtr& ipAoInitialize, esriLicenseProductCode product)
{
if (NULL == ipAoInitialize)
{
HRESULT hr = ipAoInitialize.CreateInstance(CLSID_AoInitialize);
if (FAILED(hr))
{
return FALSE;
}
}
esriLicenseStatus licenseStatus = esriLicenseFailure;
HRESULT hr = ipAoInitialize->IsProductCodeAvailable(product, &licenseStatus);
if (FAILED(hr))
{
return FALSE;
}
if (licenseStatus == esriLicenseAvailable)
{
HRESULT hr = ipAoInitialize->Initialize(product, &licenseStatus);
}
return (SUCCEEDED(hr) && licenseStatus == esriLicenseCheckedOut);
}
BOOL CExportDataToPGDBApp::InitInstance()
{
CWinApp::InitInstance();
CString strLogPath = GetDllPath() + _T("LOG");
if (!PathFileExists(strLogPath))
{
CreateDirectory(strLogPath, NULL);
}
CString strLogFile = strLogPath + _T("\\GisService_log_") + FormatToday() + _T(".log");
g_logger.SetLogFileName(strLogFile);
g_logger.SetLogLevel(LL_ERROR);
#ifdef _DEBUG
g_logger.SetLogLevel(LogLevel(LL_ERROR | LL_DEBUG | LL_INFO));
#endif
::CoInitialize(0);
m_ipAoInitialize = NULL;
CString strLicenseProduct;
if (!InitializeLicense(m_ipAoInitialize, strLicenseProduct))
{
g_logger.LogError(_T("初始化许可失败!"));
}
g_logger.LogDebug(_T("Logger Error Test Begins"));
return TRUE;
}
int CExportDataToPGDBApp::ExitInstance()
{
if (m_ipAoInitialize != NULL)
{
m_ipAoInitialize->Shutdown();
m_ipAoInitialize.Release();
}
g_logger.LogDebug(_T("Logger Error Test Ends"));
return CWinApp::ExitInstance();
}
其中,stdafx.h中引入版本管理组件;
#import "libid:6FCCEDE0-179D-4D12-B586-58C88D26CA78" no_namespace raw_interfaces_only no_implementation rename("esriProductCode", "esriVersionProductCode") rename("VersionManager","esriVersionManager")
stdafx.cpp中:
BOOL SetArcGisVersion(esriVersionProductCode VPC, CString &ver)
{
HRESULT hr;
IArcGISVersionPtr ipVersion;
hr = ipVersion.CreateInstance(__uuidof(esriVersionManager)); //
if (FAILED(hr) || ipVersion == NULL)
{
return FALSE;
}
IEnumVersionsPtr ipEnumVer;
hr = ipVersion->GetVersions(&ipEnumVer);
if (FAILED(hr) || ipEnumVer == NULL)
{
return FALSE;
}
esriVersionProductCode ipCode;
BSTR bstrName, bstrPath;
hr = ipEnumVer->Reset();
hr = ipEnumVer->Next(&ipCode, &bstrName, &bstrPath);
if (FAILED(hr))
{
return FALSE;
}
ver = bstrName;
VARIANT_BOOL vb = VARIANT_FALSE;
hr = ipVersion->LoadVersion(VPC, CComBSTR(ver), &vb);
return SUCCEEDED(hr) && vb == VARIANT_TRUE;
}