zoukankan      html  css  js  c++  java
  • C#中引用第三方ocx控件引发的问题以及解决办法

    调用OCX控件的步骤:
    1、在系统中注册该ocx控件,命令:regsvr32.exe 控件位置(加 /u 参数是取消注册)
    2、在.net的工具箱中添加该控件,拖到form中去就可以了。

    不用工具箱的话,自己手工添加,需要注意一个问题,就是要用Aximp.exe来包装一下ocx控件的类,然后再程序中引用生成的dll就可以了。
    aximp [options]{file.dll | file.ocx}
    The following command generates MediaPlayer.dll and AxMediaPlayer.dll for the Media Player control msdxm.ocx.
    aximp c:/systemroot/system32/msdxm.ocx

    ActiveX 控件导入程序将 ActiveX 控件的 COM 类型库中的类型定义转换为 Windows 窗体控件。
    Windows 窗体只能承载 Windows 窗体控件,即从 Control 派生的类。Aximp.exe 生成可承载于 Windows 窗体上的 ActiveX 控件的包装类。这使您得以使用可应用于其他 Windows 窗体控件的同一设计时支持和编程方法论。若要承载 ActiveX 控件,必须生成从 AxHost 派生的包装控件。此包装控件包含基础 ActiveX 控件的一个实例。它知道如何与 ActiveX 控件通信,但它显示为 Windows 窗体控件。这个生成的控件承载 ActiveX 控件并将其属性、方法和事件公开为生成控件的属性、方法和事件。

    如果不包装一下直接用,会出现 灾难性 错误。上面已经说明了原因。

    在项目中引用生成的ax开头的dll,在窗体代码中增加:
    声明一个公有的控件对象:
    public AxISPICRECLib.AxISPICREC AxISPICREC;
    在InitializeComponent()方法内初始化控件:
    AxISPICREC = new AxISPICRECLib.AxISPICREC();//必须new对象,否则窗体设计器出问题
                ((System.ComponentModel.ISupportInitialize)(this.AxISPICREC)).BeginInit();//初始化开始
                this.Controls.Add(this.AxISPICREC);//添加控件
                ((System.ComponentModel.ISupportInitialize)(this.AxISPICREC)).EndInit();

    如果不这样做,会出现引发类型为“System.Windows.Forms.AxHost+InvalidActiveXStateException”的异常。

                this.AxISPICREC.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("AxISPICREC.OcxState")));//设计控件状态

    如果遇到“正试图在 os 加载程序锁内执行托管代码”这个错误,请设置“调试”--“异常”
    "----"Managed Debugging Assistants"中勾掉"LoaderLock" 就可以了。

    //当前MRViewer.ocx是否已经注册过 32位
                Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey("CLSID\{FD44D72B-E01D-435C-8CAB-EF68843C2A12}\");
                int i = -1;
                if (rk == null)
                {
                    //>=0注册成功, <0 注册失败
                    i = DllRegisterServer();
                }
                if (rk != null || i >= 0)
                {
                    InitializeComponent();
                }
                else
                {
                    MessageBox.Show("MRViewer组件未注册!");
                }
    //有些电脑会报缺少midas.dll
  • 相关阅读:
    2015 年最受 Linux 爱好者欢迎的软硬件大盘点
    Java 9终于要包含Jigsaw项目了
    Linux 容器技术史话:从 chroot 到未来
    开发者最常用的 8 款 Sublime Text 3 插件
    60,000毫秒内对Linux的性能诊断效的方法
    bzoj 2595 [Wc2008]游览计划(斯坦纳树)
    bzoj 3997 [TJOI2015]组合数学(DP)
    bzoj 1014 [JSOI2008]火星人prefix(splay+hash)
    bzoj 1090 [SCOI2003]字符串折叠(区间DP)
    bzoj 1537 [POI2005]Aut- The Bus(DP+BIT)
  • 原文地址:https://www.cnblogs.com/XuPengLB/p/7596821.html
Copyright © 2011-2022 走看看