WPF應用ocx控件

前言

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

技術準備

ocx控件的本質

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

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

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

如何註冊和卸載ocx控件

  • 註冊命令: regsvr32 ocx的路徑c++

  • 註解命令: regsvr32 /u ocx的路徑
  • PS:
  • 使用管理員身份登陸cmd
  • 同一個ocx控件,只能註冊一次,即便你使用不一樣的註冊路徑。而且註冊的路徑永遠是第一次註冊的路徑windows

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兼容工具命令行,老是報錯
this

使用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,老是報錯:
code

ps

  • 項目中必定要多思考,出現問題要去分析緣由。定位問題也是一種能力。
相關文章
相關標籤/搜索