[WPF]WPF项目调用ocx控件

基于WPF调用ocx,如下(以高拍仪 EScannerCtrl.ocx 为例):

一.注册ocx控件

1.1)输入regsvr32命令注册ocx控件(需要管理员权限),如下所示:

注册指令:regsvr32 EScannerCtrl.ocx
卸载指令:regsvr32 EScannerCtrl.ocx


二.生成Ocx的调用库与调用类

注册完成之后需要生成Ocx的调用库( WinForm 能够使用的 AxHost 控件),方式有以下两种:

1.使用aximp.exe工具:

参考链接:Aximp.exe (Windows Forms ActiveX Control Importer)

1.1)打开VisualStudio中的命令行(x86版本);

1.2)输入以下指令:

aximp ocx的路径 /source  (这里加入/source主要是为了生成c#的调用类,用的时候将此类加入到vs工程中即可)

aximp EScannerCtrl.ocx /source

1.3)运行后将会生成AxEScannerCtrlLib.dll、EScannerCtrlLib.dll和AxEScannerCtrlLib.cs三个文件。

2.通过Winform项目:

2.1)打开VisualStudio,新建一个winform项目;

2.2)在工具箱中添加COM组件(EScannerCtrl.ocx)引用进来;

2.3)当前winform项目的引用会多出2个DLL(AxEScannerCtrlLib.dll、EScannerCtrlLib.dll),若没出现,则在窗体拖拉一下工具箱中新添加的Ocx控件;

2.4)把Debug文件夹下的2个DLL复制出来(默认在Debug文件夹下);


三.在WPF项目中引用

在WPF项目中引用AxEScannerCtrlLib.dll、EScannerCtrlLib.dll;方式如下:

1.右击项目-

2.选择刚生成的AxEScannerCtrlLib.dll、EScannerCtrlLib.dll;

3.点击"OK"。


四.Ocx的使用

Ocx可以通过前台跟后台两种方式使用,如下:

1)后台动态添加:

public MainWindow()
{
    InitializeComponent();

    // 创建 host 对象
    var host = new System.Windows.Forms.Integration.WindowsFormsHost();

   var ax = new AxEScannerCtrlLib();// 创建OCX的对象
   ((System.ComponentModel.ISupportInitialize)ax).BeginInit();//开始初始化ocx对象

   host.Child = ax ;
   // 将对象加入到面板中
   dockPan.Children.Add(host);

   ((System.ComponentModel.ISupportInitialize)ax).EndInit();// 结束初始化

   //.......(后续对Ocx控件的操作)
}

2)前台添加:


  
    
         
    
  

 


五.引用OCX可能遇到的一些问题

问题1:没有注册类 (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG));

解决1:可能未注册Ocx控件,重新注册;

解决2:该Ocx控件可能只支持X86,把项目的生成更改为X86平台;

问题2:引发类型为“System.Windows.Forms.AxHost+InvalidActiveXStateException”的异常 解决办法;

解决1:Ocx需要寄托于WindowsFormsHost中,用WindowsFormsHost包括Ocx控件即可;


参考资料:

1. http://msdn.microsoft.com/en-us/library/8ccdh774(VS.80).aspx

2. http://blogs.msdn.com/b/jijia/archive/2007/06/07/wpf-flash-activex.aspx

3.https://docs.microsoft.com/zh-cn/previous-versions/ms748870(v=vs.100)?redirectedfrom=MSDN

 

你可能感兴趣的:(WPF,C#)