在做乙個wpf的專案時(vs2008,c#),需要引用乙個使用c++編譯的ocx元件,但是執行的時候經常報錯,無法使用其中提供的介面和方法。上網查了一下解決辦法,方法很多,但是很多都沒有奏效。最終找到了乙個比較有效的方法,下面就是在我的程式中能夠成功使用的例子,分享一下。(雖然已經是去年的了—_—|||)
1、在c#工程檔案中,使用c++等其他語言編譯的ocx元件時,若為winform工程則不會報錯,若使用wpf等其他型別的工程,在呼叫元件內的方法時,會報錯:
災難性故障
未處理 system.runtime.interopservices.comexception
message="災難性故障 (異常來自 hresult:0x8000ffff (e_unexpected))"
source="mscorlib"
errorcode=-2147418113
解決辦法:
使用aximp(activex控制項匯入程式),將 activex 控制項的 com 型別庫中的型別定義轉換為 windows 窗體控制項。
詳見aximp.exe 一次轉換整個 activex 控制項型別庫,並產生一組程式集,這些程式集包含在原始型別庫中定義的型別的公共語言執行時元資料和控制項實現。
生成的檔案按照下面的模式命名:
com 型別的公共語言執行時**:progid.dll
activex 控制項的 windows 窗體**(其中 ax 表示 activex):axprogid.dll
方法:在cmd命令提示符視窗,輸入如下命令:
aximp e:\pis2004.ocx
將生成的pis2004lib.dll和axpis2004lib.dll引用到工程檔案中。
2、在c#的工具箱內,新增com元件pis2004.ocx,工具箱內顯示不出來,無法將其作為控制項拖拽到窗體上。
此時需要通過activex 控制項的 windows 窗體**axpis2004lib.dll,在後台**中例項化乙個控制項,並新增到窗體中。
事先需要新增引用:system.windows.forms,windowsformsintegration。
**示例:
//建立 host 物件,用於承載axtivex控制項
windowsformshost host = new
windowsformshost();
//例項化axtivex控制項
axpis2004lib.axpis2004 objaxpis2004 = new
axpis2004lib.axpis2004();
//開始初始化ocx物件
objaxpis2004.begininit();
objaxpis2004.height = 200
; objaxpis2004.width = 200
;
//結束初始化
objaxpis2004.endinit();
//將控制項新增到host中
host.child =objaxpis2004;
//將控制項顯示在頁面上(其中skp_pis2004為窗體上乙個用於放置控制項的容器stackpanel)
this.skp_pis2004.children.add(host);
進行完上述步驟之後,ocx內的方法就可以正常使用了。
在C 中使用c 編譯的ocx的方法
1 在c 工程檔案中,使用c 等其他語言編譯的ocx元件時,若為winform工程則不會報錯,若使用wpf等其他型別的工程,在呼叫元件內的方法時,會報錯 災難性故障 未處理 system.runtime.interopservices.comexception message 災難性故障 異常來自 ...
在C 程式中使用系統熱鍵
1.首先引入system.runtime.interopservices using system.runtime.interopservices 2.在類內部宣告兩個api函式,它們的位置和類的成員變數等同.system.runtime.interopservices.dllimport user...
在C 程式中使用系統熱鍵
在c 程式中使用系統熱鍵 分類 winform 2009 1 18 13 22 44 junglesong.1.首先引入system.runtime.interopservices usingsystem.runtime.interopservices 2.在類內部宣告兩個api函式,它們的位置和類...