AE10 运行时绑定(解决Could not bind to a valid ArcGIS installation)
AE10中一个明显的改变就是运行时绑定,ArcGIS10有一些明显的产品架构上变更。新架构最明显的优势是独立存在的ArcGIS Desktop和Engine runtime。你可以将ArcGIS Desktop和Engine安装在不同的目录下。你同样可以分别为Engine和Desktop打补丁。但是这种构架的变化要求你将你的Engine程序以及自定义组件绑定到你机器上指定的产品。独立应用程序既可绑定到Desktop也可以绑定到Engine的runtime。但是,要在程序使用AO之前就做好绑定。
那么,应该如何绑定呢(C#实现)
首先添加引用:
ESRI.ArcGIS.Version
然后
ESRI.ArcGIS.RuntimeManager.Bind(ProductCode.Engine)
那么,绑定就结束了,是不是很简单啊。
其他的一些新增函数
RuntimeManager.BindLicense()
绑定运行时同时初始化许可
RuntimeManager.InstalledRuntimes
返回已安装的运行时
RuntimeManager.ActiveRuntime
返回当前已绑定的运行时
RuntimeInfo
获得路径、版本等信息
这些信息在网上很容易找到,那么,如果是用C++该如何实现呢
VARIANT_BOOL InitializeLicense(esriLicenseProductCode product)
{
IAoInitializePtr ipInit(CLSID_AoInitialize);
esriLicenseStatus licenseStatus = esriLicenseFailure;
ipInit->IsProductCodeAvailable(product, &licenseStatus);
if (licenseStatus == esriLicenseAvailable)
ipInit->Initialize(product, &licenseStatus);
return (licenseStatus == esriLicenseCheckedOut);
}
这是主要的代码,但是仅仅是这样,编译的时候就会出问题,所以在绑定前,还需要LoadVersion,在stdafx.h中添加如下代码
/* Version support */
#import "libid:6FCCEDE0-179D-4D12-B586-58C88D26CA78" no_namespace raw_interfaces_only no_implementation rename("esriProductCode", "esriVersionProductCode")
#define PRODUCTSTRING(ver) L"" L#ver
#define ESRI_SET_VERSION(prod,vers)
{
HRESULT hr;
VARIANT_BOOL vb;
CComBSTR bsVer(PRODUCTSTRING(vers));
IArcGISVersionPtr ipVersion(__uuidof(VersionManager));
if(!SUCCEEDED(hr = ipVersion->LoadVersion(prod, bsVer, &vb)))
fprintf(stderr, "LoadVersion() failed with code 0x%.8x\n", hr);
else if(vb != VARIANT_TRUE)
fprintf(stderr, "LoadVersion() failed\n");
}
在InitInstance()中最开始,就调用
::CoInitialize(NULL);
ESRI_SET_VERSION(esriArcGISEngine, 10.0)
InitializeLicense(esriLicenseProductCodeEngine);
至此,已经完成许可初始化与运行时绑定。
参考资料:
http://help.arcgis.com/EN/sdk/10.0/ArcObjects_NET/conceptualhelp/index.html#//000100000nmm000000
http://hi.baidu.com/o%B3%A3%BD%F8/blog/item/eb9e590dc04a7d0a95ca6ba8.html