C#调用OCX控件Catastrophic failure解决方法
在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异常