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

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,这时候再调用任何控件方法,都会出现上述异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据如下示例写出完整的yhthon调用ocx的代码,要有示例参数ActiveX组件文件名:NISEC_SKSCX.ocx ActiveX组件GUID: <OBJECT ID=sk CLASSID="clsid: 003BD8F2-A6C3-48EF-9B72-ECFD8FC4D49F" ></OBJECT> 函数定义: StringOperate(string sInputInfo); 参数: sInputInfo 输入XML信息 返回值: 返回结果XML字符串 调用示例: <html> <head> <title>ActiveX组件调用示例 </title> <OBJECT ID=sk CLASSID="clsid:003BD8F2-A6C3-48EF-9B72-ECFD8FC4D49F" codebase="NISEC_SKSCX.ocx#version=1,0,0,1"> </OBJECT> <script language="javascript"> function SetParameter() { var sInputInfo = "<?xml version=\"1.0\" encoding=\"gbk\"?>\r\n<business id=\"20001\" comment=\"参数设置\">\r\n<body yylxdm=\"1\">\r\n<servletip>192.168.0.1</servletip>\r\n<servletport>7001</servletport>\r\n<keypwd>00000000</keypwd>\r\n</body>\r\n</business>"; alert(sInputInfo); try { ret = sk.Operate(sInputInfo); alert(ret); } catch(e) { alert(e.message + ",errno:" + e.number); } } function KeyQuery() { var sInputInfo = "<?xml version=\"1.0\" encoding=\"gbk\"?>\r\n<business id=\"20002\" comment=\"税控钥匙信息查询\">\r\n<body yylxdm=\"1\">\r\n<keypwd>00000000</keypwd>\r\n</body>\r\n</business>"; alert(sInputInfo); try { ret = sk.Operate(sInputInfo); alert(ret); } catch(e) { alert(e.message + ",errno:" + e.number); } } </script> </head> <body bgcolor=#f0f0ff> <div align="center"> <form name=formData> <table border=2 cellspacing=0> <caption ><font size=6 color=#0000ff>ActiveX组件调用示例</font></caption> <br> <tr height=50> <td width="300" align="center"><input type="button" value="参数设置" onclick="SetParameter();"></td> <td width="300" align="center"><input type="button" value="税控钥匙信息查询" onclick="KeyQuery();"></td> </tr> <br> </table> </form> </div> </body>
最新发布
05-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值