这个错误我是找了好多天才找到了
AE(ArcgisEngine)在用VC环境进行开发时,对license的初始化失败,
并在VC的编译输出窗口中提示Could not bind to a valid ArcGIS installation
是因为VC没找到Arcgis Engine的安装位置,参考官网的介绍(好不容易找到的)
http://help.arcgis.com/EN/sdk/10.0/ArcObjects_NET/conceptualhelp/index.html#//000100000nmm000000
Loading an ArcGIS runtime
对于独立的Arcgis 应用程序必须先绑定一个runtime,方法如下
// Load the ArcGISVersion library.
// This code is commonly placed in the StdAfx.h header file.
//这段代码放到stdafx.h里(或者放到主要的头文件中)
#import "libid:6FCCEDE0-179D-4D12-B586-58C88D26CA78" raw_interfaces_only no_implementation
--------------------------------------分割线--------------------------------------------------------------
// The following code can be used to bind to ArcGIS Engine Runtime:
//下面的代码要加在::AoInitialize(NULL);之后,IAoInitializePtr ipInit(CLSID_AoInitialize);之前
ArcGISVersionLib::IArcGISVersionPtr ipVer(__uuidof(ArcGISVersionLib ::VersionManager));
VARIANT_BOOL succeeded;
if (FAILED(ipVer->LoadVersion(ArcGISVersionLib::esriArcGISEngine, L "10.0", &succeeded)))
return 0;
------------------------------
例如 main.cpp
#import "libid:6FCCEDE0-179D-4D12-B586-58C88D26CA78" raw_interfaces_only no_implementation
#include <ArcSDK.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
int LocateTheArcgisVersion()
{
ArcGISVersionLib::IArcGISVersionPtr ipVer(__uuidof(ArcGISVersionLib::VersionManager));
VARIANT_BOOL succeeded;
if (FAILED(ipVer->LoadVersion(ArcGISVersionLib::esriArcGISEngine, L"10.0",&succeeded)))
return 0;
return 1;
}
int main(int argc, char **argv)
{
::AoInitialize(NULL);
LocateTheArcgisVersion();
// ArcGIS Engine licensing
IAoInitializePtr ipInit(CLSID_AoInitialize);
esriLicenseStatus status;
ipInit->Initialize(esriLicenseProductCodeEngine,&status);
if(status == esriLicenseCheckedOut)
{
cout<<"lisense ok";
}
::AoUninitialize();
system("PAUSE");
AoExit(0);
return 0;
}
我是使用的ArcGIS Desktop 10开发的,所以我的代码如下:
stdafx.h:
// stdafx.h : 标准系统包含文件的包含文件, // 或是经常使用但不常更改的 // 特定于项目的包含文件 #pragma once #ifndef _SECURE_ATL #define _SECURE_ATL 1 #endif #ifndef VC_EXTRALEAN #define VC_EXTRALEAN // 从 Windows 头中排除极少使用的资料 #endif // 如果您必须使用下列所指定的平台之前的平台,则修改下面的定义。 // 有关不同平台的相应值的最新信息,请参考 MSDN。 #ifndef WINVER // 允许使用特定于 Windows XP 或更高版本的功能。 #define WINVER 0x0501 // 将此值更改为相应的值,以适用于 Windows 的其他版本。 #endif #ifndef _WIN32_WINNT // 允许使用特定于 Windows XP 或更高版本的功能。 #define _WIN32_WINNT 0x0501 // 将此值更改为相应的值,以适用于 Windows 的其他版本。 #endif #ifndef _WIN32_WINDOWS // 允许使用特定于 Windows 98 或更高版本的功能。 #define _WIN32_WINDOWS 0x0410 // 将它更改为适合 Windows Me 或更高版本的相应值。 #endif #ifndef _WIN32_IE // 允许使用特定于 IE 6.0 或更高版本的功能。 #define _WIN32_IE 0x0600 // 将此值更改为相应的值,以适用于 IE 的其他版本。值。 #endif #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将是显式的 // 关闭 MFC 对某些常见但经常可放心忽略的警告消息的隐藏 #define _AFX_ALL_WARNINGS #include <afxwin.h> // MFC 核心组件和标准组件 #include <afxext.h> // MFC 扩展 #include <afxdisp.h> // MFC 自动化类 #ifndef _AFX_NO_OLE_SUPPORT #include <afxdtctl.h> // MFC 对 Internet Explorer 4 公共控件的支持 #endif #ifndef _AFX_NO_AFXCMN_SUPPORT #include <afxcmn.h> // MFC 对 Windows 公共控件的支持 #endif // _AFX_NO_AFXCMN_SUPPORT #ifdef _UNICODE #if defined _M_IX86 #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") #elif defined _M_IA64 #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"") #elif defined _M_X64 #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"") #else #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") #endif #endif #import "libid:6FCCEDE0-179D-4D12-B586-58C88D26CA78" raw_interfaces_only no_implementation
ArcgisOpr.cpp:
#include "stdafx.h" #include "ArcgisOpr.h" ArcgisOpr::ArcgisOpr(void) { m_pAo = NULL; m_pFcls = NULL; m_pFwks = NULL; m_isOpen = 0; m_clsType = esriGeometryNull; } ArcgisOpr::~ArcgisOpr(void) { CloseFeatureClass(); CoUninitialize(); } int ArcgisOpr::LocateTheArcgisVersion() { ArcGISVersionLib::IArcGISVersionPtr ipVer(__uuidof(ArcGISVersionLib::VersionManager)); VARIANT_BOOL succeeded; if (FAILED(ipVer->LoadVersion(ArcGISVersionLib::esriArcGISDesktop, L"10.0",&succeeded))) return 0; return 1; } long ArcgisOpr::InitFcls(const char* pszWSFilePath) { TCHAR strPath[100] = {0}; HRESULT hr = S_FALSE; esriLicenseStatus esriLice = esriLicenseUnavailable; BSTR bstrPath = NULL; IWorkspacePtr ipWksPtr = NULL; IWorkspaceFactoryPtr ipWksFtyPtr = NULL; //com组建初始化 CoInitialize(NULL); LocateTheArcgisVersion(); /* ::AoInitialize(NULL); LocateTheArcgisVersion(); // ArcGIS Engine licensing IAoInitializePtr ipInit(CLSID_AoInitialize); esriLicenseStatus status; ipInit->Initialize(esriLicenseProductCodeEngine,&status); if(status == esriLicenseCheckedOut) { cout<<"lisense ok"; } ::AoUninitialize(); system("PAUSE"); AoExit(0); return 0; */ //初始化AO组件的license m_pAo.CreateInstance(CLSID_AoInitialize); hr = m_pAo->Initialize(esriLicenseProductCodeArcInfo,&esriLice); //建立ACCESS数据库工作区间工厂 hr = ipWksFtyPtr.CreateInstance(CLSID_ShapefileWorkspaceFactory); if (FAILED(hr)) { return(0); } //获取工作区 bstrPath = _com_util::ConvertStringToBSTR(pszWSFilePath); hr = ipWksFtyPtr->OpenFromFile(bstrPath,0,&ipWksPtr); if (FAILED(hr)) { return(0); } //得到要素类工作空间 hr = ipWksPtr->QueryInterface(IID_IFeatureWorkspace,(void**)&m_pFwks); if (FAILED(hr)) { return(0); } //释放指针 if (bstrPath!=NULL) { SysFreeString(bstrPath); bstrPath = NULL; } return(1); } // //功能:打开地理数据库 // //参数:clsName [in]-地理数据库名字 // //返回值:成功返回1,失败返回0或者负数 long ArcgisOpr::OpenFeatureClass(const char *szClsName) { IWorkspacePtr pWksPtr = NULL; IFeatureWorkspacePtr pFWksPtr = NULL; IFeatureClassPtr pFclsPtr = NULL; IWorkspaceFactoryPtr pWksFPtr = NULL; HRESULT hr = S_FALSE; long rtn = 0; BSTR clsName = _com_util::ConvertStringToBSTR(szClsName); if(clsName==NULL) return (0); //1.在打开之前先关闭前面打开的 CloseFeatureClass(); //2、获取工作空间 //3。打开地理数据库要素类 hr = m_pFwks->OpenFeatureClass(clsName,&m_pFcls); if(SUCCEEDED(hr)) { //4。取要素类类型 hr = m_pFcls->get_ShapeType(&m_clsType); m_isOpen = 1; if(SUCCEEDED(hr)) { rtn = 1; } } else { CloseFeatureClass(); rtn = -1; } return(rtn); } // //功能:关闭要素类 // //参数:无 // //返回:成功返回1,失败返回0或者负数 long ArcgisOpr::CloseFeatureClass() { m_pFcls = NULL; m_isOpen = 0; m_clsType = esriGeometryNull; return (1); } long ArcgisOpr::GetClsType(esriGeometryType type) { type = m_clsType; return(1); } long ArcgisOpr::IsOpened() { return m_isOpen; } //获取要素个数 long ArcgisOpr::GetFeasNum(long *pnCnt) { IQueryFilterPtr pQuery = NULL; HRESULT hr = S_FALSE; long rtn = 0; pQuery.CreateInstance(CLSID_QueryFilter); hr = m_pFcls->FeatureCount(pQuery,pnCnt); if(SUCCEEDED(hr)) rtn=1; return (rtn); } //获取要素类的属性结构 long ArcgisOpr::GetAttStru(IFields **pFlds) { ITablePtr pTab = NULL; HRESULT hr = S_FALSE; pTab = m_pFcls; hr = pTab->get_Fields(pFlds); if (SUCCEEDED(hr)==1) { return(1); } return(0); } //获取某一要素的属性值 long ArcgisOpr::GetAtt(long fID/*从0开始*/, ARC_IRow **pRow) { long rtn=0; IFeaturePtr pFeature; HRESULT hr = 0; IFieldsPtr ptfields; if(m_isOpen==0) return (0); hr = m_pFcls->GetFeature(fID,&pFeature); if(SUCCEEDED(hr)) { hr= pFeature->QueryInterface(IID_ARC_IRow,(void**)pRow); if(pRow!=NULL) { rtn =1; } } return (rtn); } //通过要素名称获取要素的ID long ArcgisOpr::GetFeaIDByName(const char* pszFldName,const char* pszFeaName,long *pnID) { int i = 0; long rtn = 0; long nCnt =0; ARC_IRowPtr pArow = NULL; IRowBufferPtr pRowBuf = NULL; HRESULT hr = S_FALSE; ITablePtr pTbl = m_pFcls; IFeaturePtr pFea = NULL; IFieldsPtr pFlds = NULL; char szFldName[64] = {0}; long nIndex = 0; rtn = GetFeasNum(&nCnt); if (rtn <=0) { return(0); } GetAttStru(&pFlds); long nFldCnt; BSTR bstrFldName = NULL; bstrFldName = _com_util::ConvertStringToBSTR(pszFldName); pFlds->FindField(bstrFldName,&nIndex); VARIANT varValue; for (i=0;i<nCnt;i++) { hr = m_pFcls->GetFeature(i,&pFea); pArow = pFea; VariantInit(&varValue); pArow->get_Value(nIndex,&varValue); if(strcmp(pszFeaName,_com_util::ConvertBSTRToString(varValue.bstrVal))==0) { *pnID = i; } else { continue; } if (bstrFldName!=NULL) { SysFreeString(bstrFldName); bstrFldName = NULL; } } return(0); } //获取多边形外界矩形范围 long ArcgisOpr::polygon_GetRect(long id,D_RECT *rect) { IFeaturePtr pFeature; HRESULT Isucc = 0; IEnvelopePtr pEnve = NULL; //1.判断入口参数 if(id<1) return (0); if(m_isOpen==0) return (0); // id=id-1; //esri的要素id从0开始,zoyon从1开始 //2.取要素 Isucc = m_pFcls->GetFeature(id,&pFeature); Isucc = pFeature->get_Extent(&pEnve); if(FAILED(Isucc)) return(0); pEnve->get_XMin(&rect->xmin); pEnve->get_YMin(&rect->ymin); pEnve->get_XMax(&rect->xmax); pEnve->get_YMax(&rect->ymax); return (1); } //获取多边形的边界点 long ArcgisOpr::GetDotsByPolygon(long nID,long *pnPolyCnt,long *pnTolPntCnt,/*D_DOT *pDots*/D_DOT Dots[]) { HRESULT hr = S_FALSE; IFeaturePtr pFea = NULL; IGeometryPtr pGeo = NULL; IPolygonPtr pPolygon = NULL; IGeometryCollectionPtr pGeoCol = NULL; ISegmentCollectionPtr pSegCol = NULL; IGeometryPtr pSmallPoly = NULL; ISegmentPtr pSeg = NULL; IPointPtr pPnt = NULL; D_DOT *dots = NULL; long nPolygonCnt = 0; long nSegCnt = 0; long nPntCnt = 0; long i = 0; int j = 0; long nPreNum = 0; long nTolPntsNum = 0; if (m_clsType == esriGeometryPolygon) { m_pFcls->GetFeature(nID,&pFea); pFea->get_Shape(&pGeo); pPolygon = pGeo; pGeoCol = pPolygon; pGeoCol->get_GeometryCount(&nPolygonCnt); dots = new D_DOT[20000]; for (i = 0;i<nPolygonCnt;i++) { pGeoCol->get_Geometry(i,&pSmallPoly); pSegCol = pSmallPoly; pSegCol->get_SegmentCount(&nSegCnt); nPntCnt = nSegCnt+1; for (j = 0;j<nSegCnt;j++) { pSegCol->get_Segment(j,&pSeg); pSeg->get_FromPoint(&pPnt); pPnt->get_X(&dots[j+nTolPntsNum].x); pPnt->get_Y(&dots[j+nTolPntsNum].y); dots[j+nTolPntsNum].nHoleID = i+1; dots[j+nTolPntsNum].nIndex = j+1; if (j==53) { j=53; } } pSeg->get_ToPoint(&pPnt); pPnt->get_X(&dots[j+nTolPntsNum].x); pPnt->get_Y(&dots[j+nTolPntsNum].y); dots[j+nTolPntsNum].nHoleID = i+1; dots[j+nTolPntsNum].nIndex = j+1; nPreNum = nTolPntsNum; nTolPntsNum = nTolPntsNum+nPntCnt; } *pnPolyCnt = nPolygonCnt; *pnTolPntCnt = nTolPntsNum; for(i=0;i<nTolPntsNum;i++) { Dots[i] = dots[i]; } delete []dots; return(1); } delete []dots; return(1); } //添加点到要素类中。 long ArcgisOpr::AddDots(const char* pszName,long nPntsCnt,D_DOT dots[]) { HRESULT hr = S_FALSE; IFeaturePtr pFea = NULL; IPointPtr pPnt = NULL; BSTR bstrName = NULL; bstrName = _com_util::ConvertStringToBSTR(pszName); m_pFwks->OpenFeatureClass(bstrName,&m_pFcls1); int i= 0; for (i = 0;i<nPntsCnt;i++) { m_pFcls1->CreateFeature(&pFea); pPnt.CreateInstance(CLSID_Point); pPnt->put_X(dots[i].x); pPnt->put_Y(dots[i].y); pFea->putref_Shape(pPnt); pFea->Store(); } if(bstrName!=NULL) { SysFreeString(bstrName); bstrName = NULL; } return(1); } //获取点要素类中所有的点 long ArcgisOpr::GetAllDots(const char* pszClsName,D_DOT dots[],long *pPointsNum){ HRESULT hr = S_FALSE; IFeaturePtr pFea = NULL; IPointPtr pPnt = NULL; IGeometryPtr pGeo = NULL; BSTR bstrName = NULL; D_DOT dot; bstrName = _com_util::ConvertStringToBSTR(pszClsName); m_pFwks->OpenFeatureClass(bstrName,&m_pFcls1); int i= 0; long nFeaNum = 0; m_pFcls1->FeatureCount(NULL,&nFeaNum); for (i = 0;i<nFeaNum;i++) { m_pFcls1->GetFeature(i,&pFea); pFea->get_Shape(&pGeo); pPnt = pGeo; pPnt->get_X(&(dot.x)); pPnt->get_Y(&(dot.y)); dots[i] = dot; } *pPointsNum = nFeaNum; if(bstrName!=NULL) { SysFreeString(bstrName); bstrName = NULL; } return(1); } //获得所有的县 long ArcgisOpr::GetAllXian(const char *pszClsName,Xian xian[],long *pXianNum) { IFeaturePtr ptFea = NULL; BSTR bstrName = _com_util::ConvertStringToBSTR(pszClsName); HRESULT hr = S_FALSE; IRowBufferPtr ptRowBuf = NULL; VARIANT var; VariantInit(&var); hr = m_pFwks->OpenFeatureClass(bstrName,&m_pFcls); if (hr == S_FALSE) { return 0; } long nFeaNum = 0; m_pFcls->FeatureCount(NULL,&nFeaNum); Xian tempXian; for (int i = 1030;i<nFeaNum;i++) { memset((void*)&tempXian,0,sizeof(Xian)); m_pFcls->GetFeature(i,&ptFea); ptRowBuf = ptFea; ptRowBuf->get_Value(1,&var); strcpy(tempXian.szXianName,_com_util::ConvertBSTRToString(var.bstrVal)); xian[i] = tempXian; } *pXianNum = nFeaNum; if (bstrName!=NULL) { SysFreeString(bstrName); bstrName = NULL; } return 1; } //填充县的字段 long ArcgisOpr::FillXianFld(const char *pszClsName,Xian xian[]) { IFeaturePtr ptFea = NULL; BSTR bstrName = _com_util::ConvertStringToBSTR(pszClsName); HRESULT hr = S_FALSE; IRowBufferPtr ptRowBuf = NULL; VARIANT var; ARC_IRowPtr ptRow = NULL; VariantInit(&var); hr = m_pFwks->OpenFeatureClass(bstrName,&m_pFcls); if (hr == S_FALSE) { return 0; } long nFeaNum = 0; m_pFcls->FeatureCount(NULL,&nFeaNum); Xian tempXian; for (int i = 1030;i<nFeaNum;i++) { tempXian = xian[i]; m_pFcls->GetFeature(i,&ptFea); ptFea.QueryInterface(IID_ARC_IRow,&ptRow); ptRowBuf = ptFea; var.bstrVal = _com_util::ConvertStringToBSTR(tempXian.szCityName); ptRowBuf->put_Value(2,var); UpdateRow(ptRowBuf,ptRow); ptRow->Store(); } if (bstrName!=NULL) { SysFreeString(bstrName); bstrName = NULL; } return 1; } //将缓冲行更新到要素中 long ArcgisOpr::UpdateRow(IRowBufferPtr rowBuff,ARC_IRowPtr oldRow) {//测试成功 IFieldsPtr flds; IFieldPtr fld; long rtn=0,fldNum=0,i=0; esriFieldType esiType; VARIANT_BOOL flag=0; VARIANT eValue; HRESULT Isucc = -1; if(m_isOpen==0) return (0); if(rowBuff==NULL || oldRow==NULL) return(0); Isucc = rowBuff->get_Fields(&flds); if(Isucc!=S_OK) return -1; Isucc = flds->get_FieldCount(&fldNum); if(fldNum<1) return (0); for(i=0;i<fldNum;i++) { flds->get_Field(i,&fld); if(fld==NULL) return (0); fld->get_Type(&esiType); fld->get_Editable(&flag); if((esiType!=esriFieldTypeGeometry)&&(-1==flag))//不拷贝OID { Isucc=rowBuff->get_Value(i,&eValue); if(eValue.vt==VT_NULL) { rtn = 1; continue; } Isucc=oldRow->put_Value(i,eValue); // if(FAILED(Isucc)) // return (0); } } if(SUCCEEDED(Isucc)) rtn = 1; return (rtn); }