java调用ocx出现灾难性故障<属转载>

本文介绍了一种解决Java调用OCX控件时出现ComFailException的方法。通过重写COleControl.IsInvokeAllowed(DISPID)方法,确保控件正确初始化或加载,避免因ActiveX设计缺陷导致的异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Exception in thread "main" com.jacob.com.ComFailException: A COM exception has been encountered:
At Invoke of: isLogin
Description: 灾难性故障

 at com.jacob.com.Dispatch.invokev(Native Method)
 at com.jacob.com.Dispatch.invokev(Dispatch.java:804)
 at com.jacob.com.Dispatch.callN(Dispatch.java:440)
 at com.jacob.com.Dispatch.call(Dispatch.java:510)
 at com.vflow.sms.InitOcxFunctions.isLogin(InitOcxFunctions.java:36)
 at com.vflow.test.TestOcx.main(TestOcx.java:14)

 
 经过在网上搜索,最终成功解决(测试环境,jdk1.6,jacob1.9),方法如下:

在OCX控件中,重写COleControl.IsInvokeAllowed (DISPID)方法,即在控件的CMyNameCtrl中增加一个方法

BOOL CMyNameCtrl::IsInvokeAllowed (DISPID)

{

      return TRUE;

}

用这个方法的理由是:

这个错误是由ActiveX结构设计造成的。

在Ole4.0版本之前,外部程序是可以直接调用OCX中方法的。Ole4.0之后,每次调用控件中的方法,系统会自动检查是否允许调用,即运行COleControl.IsInvokeAllowed (DISPID)

该方法检查控件是否正确的初始化或者是否通过持久存储接口正确加载,如果两个条件有一个满足,即返回TRUE,否则返回FALSE。

当控件在MFC中使用时,很多细节,如初始化,都被过滤了,这样,大多数用户都不会遇到这个问题。但是,当我们从C、C++的dll中调用控件时,不满足上述条件,该方法返回FALSE,这时候再调用任何控件方法,都会出现上述异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值