WPF應用ocx控件

前言

最近項目中需要集成電話控制功能。設計到一個USB電話錄音盒的二次開發。硬件提供商提供了ocx控件。項目爲C/S架構系統,客戶端使用了WPF技術。所以本文重點分析,在WPF中如何引用第三方提供的ocx控件。

技術準備

ocx控件的本質

  • 可以理解爲一種基於COM的用戶控件
  • 不能獨立運行
  • 可以有多種語言編寫,包括c++,java等
  • 使用前必須註冊,打包應用程序時,最好將控件放到部署目錄中,然後註冊
  • ActiveX是OCX 的高級形式(也許把它看作OLE的較簡單形式更合適)
  • ActiveX也可能是dll類型

如何查看本機已註冊的ocx控件

  • 使用綠色軟件【RegDllView】可以查看本機註冊的所有的dll和ocx。
  • 有些ocx可以通過【RegDllView】直接卸載,右鍵-》刪除選定文件所有項。無法刪除時,使用cmd命令行刪除或者已管理員身份運行【RegDllView】。

如何註冊和卸載ocx控件

  • 註冊命令: regsvr32 ocx的路徑

  • 註解命令: regsvr32 /u ocx的路徑

  • PS:
    • 使用管理員身份登錄cmd
    • 同一個ocx控件,只能註冊一次,即使你使用不同的註冊路徑。並且註冊的路徑永遠是第一次註冊的路徑

WPF中使用ocx控件

註冊ocx控件

在CMD命令行了,執行註冊命令。
項目中可以將OCX控件拷貝到軟件exe目錄下,然後編寫一個bat腳本進行註冊,將腳本放到ocx相同目錄運行即可。

@echo off
echo 如果 Windows 7 下注冊失敗請右擊本批處理文件選擇以管理員方式運行
cd /d "%~dp0"
regsvr32 "你的名字.ocx"
pause

生成相應的dll,並在項目中引用

用管理員身份使用VS的開發人員命令提示工具,調用AxImp

雖然顯示的生成目錄爲:c:\windows\system32。實際中,我本機的輸出目錄C:\Windows\SysWOW64
另外:一開始我使用的是 VS2015 X64 X86兼容工具命令行,總是報錯

使用WindowsFormsHost包裝控件實體

ocx控件不能在WPF中直接使用,需要使用WindowsFormsHost包裝控件實體

AxUSBPHONECTRLLib.AxUsbPhoneCtrl usbPhone = new AxUSBPHONECTRLLib.AxUsbPhoneCtrl();
((System.ComponentModel.ISupportInitialize)usbPhone).BeginInit();
System.Windows.Forms.Integration.WindowsFormsHost host = new System.Windows.Forms.Integration.WindowsFormsHost(){Child = usbPhone};        
((System.ComponentModel.ISupportInitialize)usbPhone).EndInit();
this.grid.Children.Add(host);

使用System.ComponentModel.ISupportInitialize初始化控件實體

如果你不需要ocx的界面,只使用控件的功能,代碼可以簡化爲:

AxUSBPHONECTRLLib.AxUsbPhoneCtrl usbPhone = new AxUSBPHONECTRLLib.AxUsbPhoneCtrl();
((System.ComponentModel.ISupportInitialize)usbPhone).BeginInit();
new System.Windows.Forms.Integration.WindowsFormsHost(){Child = usbPhone};        
((System.ComponentModel.ISupportInitialize)usbPhone).EndInit();

將ocx控件複製到exe目錄中(也可以在項目中直接添加,生成項目時,會自動拷貝)

一定要將ocx控件複製到exe目錄中。剛開始我沒有複製ocx,總是報錯:

ps

  • 項目中一定要多思考,出現問題要去分析原因。定位問題也是一種能力。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章