C#调用OCX控件Catastrophic failure解决方法
2011-07-13 12:03
288 查看
在C#中调用VC写的OCX控件,有时会碰到一些很奇怪的问题,比如运行时程序报错:(8000ffff) : "Catastrophic failure".具体什么原因导致?以下以一个简单的OCX为例(简称APT.ocx)。
APT.ocx在VB以及VC中使用没有问题,但在C#中使用就很奇怪,具体现象如下:
注册APT.ocx后,直接在C#工程中引用该控件,在调用该控件提供的方法时程序报错:(8000ffff) : "Catastrophic failure".经查证,导致此异常的原因在于C#调用控件的方式是通过automation server,但在visual C++4.0以后在IDispatch::Invoke中增加IsInvokeAllowed判断,来确定是否允许automation call,系统默认是返回False,也就是不支持automation call。
为解决这一问题,可以采用microsoft提供的Aximp.exe工具对APT.ocx做转换,对APT.ocx再次封装成两个类库(APTLib.dll,AxAPTLib.dll),但对程序中的使用还要分两种情况:
(1)C# Windows Form
对于Windows Form程序,直接添加AxAPTLib.dll引用,调用Controls.add()方法添加AxAPTLib.AxAPT类实例即可
(2)C#非Windows Form
对于非Windows Form的C#程序而言,操作稍显麻烦,需要实例化AxAPTLib.AxAPT(),并显式调用该实例的CreateControl()方法才能调用其他方法否则在调用时系统将报AxHost.InvalidActiveXStateException异常
详情请参阅: http://support.microsoft.com/kb/189065/en-us http://support.microsoft.com/kb/146120/EN-US/
APT.ocx在VB以及VC中使用没有问题,但在C#中使用就很奇怪,具体现象如下:
注册APT.ocx后,直接在C#工程中引用该控件,在调用该控件提供的方法时程序报错:(8000ffff) : "Catastrophic failure".经查证,导致此异常的原因在于C#调用控件的方式是通过automation server,但在visual C++4.0以后在IDispatch::Invoke中增加IsInvokeAllowed判断,来确定是否允许automation call,系统默认是返回False,也就是不支持automation call。
为解决这一问题,可以采用microsoft提供的Aximp.exe工具对APT.ocx做转换,对APT.ocx再次封装成两个类库(APTLib.dll,AxAPTLib.dll),但对程序中的使用还要分两种情况:
(1)C# Windows Form
对于Windows Form程序,直接添加AxAPTLib.dll引用,调用Controls.add()方法添加AxAPTLib.AxAPT类实例即可
(2)C#非Windows Form
对于非Windows Form的C#程序而言,操作稍显麻烦,需要实例化AxAPTLib.AxAPT(),并显式调用该实例的CreateControl()方法才能调用其他方法否则在调用时系统将报AxHost.InvalidActiveXStateException异常
详情请参阅: http://support.microsoft.com/kb/189065/en-us http://support.microsoft.com/kb/146120/EN-US/
相关文章推荐
- C#调用OCX控件Catastrophic failure解决方法
- C#调用OCX控件Catastrophic failure解决方法
- ocx控件 编译成C#调用的dll 方法 转
- 基于C#调用OCX控件的常用方法(推荐)
- 关于OCX控件在ie下调用不了接口的解决方法
- 解决“ .dll(或.ocx)控件已加载,但对DllregisterServer的调用失败,错误代码为0x80004005”问题的两种终极方法:SubInACL安装 VS 命令提示符
- 解决C#中取消方向键对控件焦点控制的实现方法
- C# 调用C++DLL参数异常解决方法
- 网页里面调用OCX控件的一般方法
- C#调用C++dll文件获取数据得到乱码的解决方法
- 解析c#在未出现异常情况下查看当前调用堆栈的解决方法
- 详解C#自动注册Dll(OCX)控件的两种方法(转)
- 其他类调用C#控件并修改属性的方法
- C#线程间不能调用剪切板的解决方法
- C#调用dll提示"试图加载格式不正确的程序"解决方法
- 定制C#TextBox控件中只允许输入数字的解决方法
- 问题-Delphi在多线程中使用其他窗体上的控件,报“尚未调用CoInitialize”解决方法
- 关于C#中webbrower控件调用的浏览器不支持热力图功能的解决办法
- Delphi 调用C#编写的WebService 参数为Null解决方法
- C#中引用第三方ocx控件引发的问题以及解决办法