急!急!急!jacob 调用ocx控件时 报错误

小吕 发布于 2010/09/20 16:17
阅读 2K+
收藏 1

最近做一个项目,要用到jacob 调用ocx控件。程序报错误 ,跪求高手赐教!!!

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

 at com.jacob.com.Dispatch.invokev(Native Method)
 at com.jacob.com.Dispatch.invokev(Dispatch.java:858)
 at com.jacob.com.Dispatch.callN(Dispatch.java:455)
 at com.jacob.com.Dispatch.call(Dispatch.java:533)
 at com.lv.office.AIPToTest.jacob(AIPToTest.java:24)
 at com.lv.office.AIPToTest.main(AIPToTest.java:15)

加载中
0
V
V

没接触过,爱莫能助,关注中

0
小吕
小吕

急!急!

0
jingshishengxu
jingshishengxu

是不是没有注册ocx

0
j
jidisoft

有没有copy到system32目录

0
_凤求凰_
_凤求凰_

很明显,你的oex插件没有找到,把拿东西放到系统system32下或者放到系统环境变量里,这就应该就ok了吧。

0
小吕
小吕

l  先把HWPostil.ocx控件放入c:\windows\system32 文件夹下

l  再输入regsvr32 HWPostil.ocx 命令进行注册;

这些步骤我都做了,程序运行还是报错。

这是从网上找到的解决方案:

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

BOOL CMyNameCtrl::IsInvokeAllowed (DISPID)

   {

      return TRUE;

   }

用这个方法的理由是:

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

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

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

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

  

  

 这种办法显然不行,因为ocx第三方控件是另一家公司提供的。我之后用vs2010建了一个winform 工程,然后导入ocx控件,控件竟然能用,不报错误。所以,我采取了另一种办法,java 调用exe应用程序。

 

 

 

返回顶部
顶部