Could not bind to a valid ArcGIS installation问题的解决

这个错误我是找了好多天才找到了

 

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

Stand-alone ArcGIS applications must locate an appropriate ArcGIS product installation before any ArcObjects code (including license initialization) is called. You must decide what runtime is needed for the application. This must be done whether the license initialization is carried out using the LicenseControl or by using the AoInitialize class. The application programming interfaces (APIs) used to bind to the ArcGIS runtime are in IArcGISVersion in the ArcGISVersionLib namespace. To bind to the runtime, make a call to the LoadVersion method. See the following code example:

 

对于独立的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);
}


你可能感兴趣的:(Could not bind to a valid ArcGIS installation问题的解决)