關於異常來自 HRESULT 0x80040351

2022-04-01 11:02:24 字數 4097 閱讀 7192

今天在進行開啟工作空間操作的時候突然報錯「異常來自 hresult:0x80040351」。

分析後發現是iworkspacefactory實現類的對應關係不對。本來想運算元據庫中的.gdb檔案,但是宣告的時候卻寫成了iworkspacefactory workspacefactory = new shapefileworkspacefactory();後來改成iworkspacefactory workspacefactory = new filegdbworkspacefactoryclass();問題就迎刃而解了。慚愧...

轉乙份「arcengine中開啟各種資料來源(workspace)的連線」,資料來源型別包括sde、personal/file、shapefile、cad資料、影像圖、影像資料集。

1.企業資料庫(sde)

企業資料庫需要使用sde來管理,所以需要使用sde的workspace來表示連線。在ae介面中,workspace是由factory開啟的。**如下:

//準備連線引數

esri.arcgis.esrisystem.ipropertyset ppropset=new propertysetclass();

ppropset.setproperty("server","伺服器機器名" );

ppropset.setproperty("instance","sde執行的埠號");

ppropset.setproperty("user","使用者名稱");

ppropset.setproperty("password","口令" );

ppropset.setproperty("version","版本");

sdeworkspacefactory sdewkspfact=new sdeworkspacefactoryclass();

ifeatureworkspace pfeawksp=(ifeatureworkspace)sdewkspfact.open(ppropset,0);

其中唯一需要解釋的可能就是版本(version).對於沒有使用版本或者第一次連線(沒有建立空間資料庫,當然沒有版本了). 該處使用sde.default這個版本。這是預設的版本。

ipropertyset:: setproperty

public void setproperty(string name,object value)

2.個人資料庫(personalgeodatabase、filegeodatabase)

arcengine中個人資料庫為access。

string filepath="e:\\tt.mdb";

accessworkspacefactory fac=new accessworkspacefactoryclass();

ifeatureworkspace space=(ifeatureworkspace)fac.openfromfile(filepath,0); 這是用的最多的一種方式.

如果是filegeodatabasse,則將

filegdbworkspacefactory pwsf = new filegdbworkspacefactory;

ifeatureworkspace pws1= pwsf.openfromfile(spath, 0);

如果用ipropertyset。如下:

//personal geodatabase e.g., database = "c:\\mydata\\mypgdb.mdb"

public iworkspace open_pgdb_workspace(string database)

3.shapefile檔案

shapefile和access的開啟方式有一點相同。也有差異。

//這是shape所在的目錄(注意:是目錄)

string spacepath="e:\\shapefile";

ishapefileworkspacefactory fac=new shapefileworkspacefactoryclass(); ifeatureworkspace space=(ifeatureworkspace)fac.openfromfile(spacepath,0);

ifeatureclass fc=space.openfeatureclass(「china」);

4.autocad dwg檔案

autocad檔案和一般的esri格式不同。所以**會有一點點奇怪。假設有乙個dwg檔案為e:\\cad\\107.dwg 下面是開啟的**:

cadworkspacefactoryclass fac=new cadworkspacefactoryclass ();

string filepath="e:\\cad";

ifeatureworkspace space=fac.openfromfile(filepath,0) as ifeatureworkspace ;

下面是開啟featureclass的**:

//線ifeatureclass polyline =space.openfeatureclass("107.dwg:polyline");

ifeaturelayer layer=new cadfeaturelayerclass ();

layer.featureclass =polyline;

//點ifeatureclass point=space.openfeatureclass ("107.dwg:point");

layer=new cadfeaturelayerclass ();

layer.featureclass =point;

//面ifeatureclass polygon=space.openfeatureclass ("107.dwg:polygon");

layer=new cadfeaturelayerclass();

layer.featureclass =polygon;

//註記

ifeatureclass anno=space.openfeatureclass ("107.dwg:annotation"); layer=new cadannotationlayerclass();

layer.featureclass =anno;

5.影像**件

//檔案路徑

string filepath="e:\\image\\117.tif";

irasterlayer rasterlayer=new rasterlayerclass();

rasterlayer.createfromfilepath(filepath );

6.資料庫中的影像資料集。

//資料庫連線

iworkspace space=openspace();

//開啟資料庫的方式

irasterworkspaceex rasterspace=(irasterworkspaceex)space;

irasterdataset rasterdataset=rasterspace.openrasterdataset (setname.name );

irasterlayer raslayer=new rasterlayerclass();

raslayer.createfromdataset(rasterdataset);

irasterworkspaceex:提供建立和開啟柵格目錄或柵格資料集的方法。

但是irasterworkspaceex,irasterworkspace, irasterworkspace2都有openrasterdataset。irasterworkspace經常也可用於開啟柵格資料,如:

pworkspacefactory = new rasterworkspacefactoryclass();

prasterworkspace = (irasterworkspace)pworkspacefactory.openfromfile(filepath, 0);

irasterdataset prasterdataset = (irasterdataset)prasterworkspace.openrasterdataset(filename);

irasterlayer prasterlayer = new rasterlayerclass();

prasterlayer.createfromdataset(prasterdataset);

異常來自 HRESULT 0x80040E14

突然聽客戶說系統只要涉及到編輯和新增功能就會出現 異常來自 hresult 0x80040e14 這個異常也見過,他是出現在訪問站點的時候,只要輸入siteurl 就會出現 異常來自 hresult 0x80040e14 以前的出現異常的主要原因是c盤的空間不足,導致異常。刪除 c program ...

使用C 異常來取代exit 函式

使用c 異常來取代exit 函式 從c語言開始接觸c 的人,恐怕都知道exit 這個函式,似乎現在很多的程式設計師都有這樣一種習慣,在程式一遇到錯誤 或任務剛完成時,把呼叫exit 函式當成是一種最好的結束程式的方法。在以前遺留的許多老式c c 中,這種現象非常普遍,但當手頭的軟體專案逐步進展並越來...

用異常來通知執行緒安全結束

突然領悟到異常其實是中斷。於是想到用異常來通知執行緒安全結束,就是不知道這樣做的效率怎麼樣,據說catch exception很費時間。include stdafx.h include windows.h include process.h struct param void close signa...