在做一個WPF的項目時(VS2008,C#),需要引用一個使用c++編譯的ocx組件,但是運行的時候經(jīng)常報錯,無法使用其中提供的接口和方法。上網(wǎng)查了一下解決辦法,方法很多,但是很多都沒有奏效。最終找到了一個比較有效的方法,下面就是在我的程序中能夠成功使用的例子,分享一下。(雖然已經(jīng)是去年的了—_—|||)
1、在c#工程文件中,使用c++等其他語言編譯的ocx組件時,若為WinForm工程則不會報錯,若使用WPF等其他類型的工程,在調(diào)用組件內(nèi)的方法時,會報錯:
災難性故障
未處理 System.Runtime.InteropServices.COMException
Message="災難性故障 (異常來自 HRESULT:0x8000FFFF (E_UNEXPECTED))"
Source="mscorlib"
ErrorCode=-2147418113
解決辦法:
使用aximp(ActiveX控件導入程序),將 ActiveX 控件的 COM 類型庫中的類型定義轉(zhuǎn)換為 Windows 窗體控件。
詳見http://msdn.microsoft.com/zh-cn/library/8ccdh774.aspx。
Aximp.exe 一次轉(zhuǎn)換整個 ActiveX 控件類型庫,并產(chǎn)生一組程序集,這些程序集包含在原始類型庫中定義的類型的公共語言運行時元數(shù)據(jù)和控件實現(xiàn)。
生成的文件按照下面的模式命名:
COM 類型的公共語言運行時代理:progid.dll
ActiveX 控件的 Windows 窗體代理(其中 Ax 表示 ActiveX):Axprogid.dll
方法:在cmd命令提示符窗口,輸入如下命令:
aximp e:\PIS2004.ocx
將生成的PIS2004Lib.dll和AxPIS2004Lib.dll引用到工程文件中。
2、在c#的工具箱內(nèi),添加COM組件PIS2004.ocx,工具箱內(nèi)顯示不出來,無法將其作為控件拖拽到窗體上。
此時需要通過ActiveX 控件的 Windows 窗體代理AxPIS2004Lib.dll,在后臺代碼中實例化一個控件,并添加到窗體中。
事先需要添加引用:System.Windows.Forms,WindowsFormsIntegration。
代碼示例:
// 創(chuàng)建 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內(nèi)的方法就可以正常使用了。
聯(lián)系客服