Java调用ocx控件以及dll

摘要:
以上的两个文件您可以到网上http://danadler.com/jacob/下载的1.7的版本jacob.jar与jacob.dll版本一致。bug解决:1.java.lang.UnsatisfiedLinkError:nojacobinjava.library.path原因是:没有把jacob.dll拷贝到jdkin或者C:WINDOWSsystem32目录下2.Exceptioninthread"main"com.jacob.com.ComFailException:Can'tgetobjectclsidfromprogid原因是:regsvr32***.ocx命令进行注册后,获取的progid有误;3.Exceptioninthread"main"com.jacob.com.ComFailException:ACOMexceptionhasbeenencountered:AtInvokeof:LoadFileDescription:灾难性故障atcom.jacob.com.Dispatch.invokevatcom.jacob.com.Dispatch.invokevatcom.jacob.com.Dispatch.callNatcom.jacob.com.Dispatch.callatcom.lv.office.AIPToTest.jacobatcom.lv.office.AIPToTest.main原因是:在OCX控件中,重写COleControl.IsInvokeAllowed方法,即在控件的CMyNameCtrl中增加一个方法BOOLCMyNameCtrl::IsInvokeAllowed{returnTRUE;}用这个方法的理由是:这个错误是由ActiveX结构设计造成的。

http://lvqingboy-163-com.iteye.com/blog/769358

通过Java调用OCX控件有几种方法,JNI、JACOB、Jawin等

1.JNI 最直接的方式,也是最麻烦的方式,需要自己完成所有的工作,不推荐。

2.Jawin 尝试了一下,效果不错,但相对来说,其编程风格更贴近Windows,离Java有点远 。

3.Jacob 使用Jacob非常方便,Java编程风格,需要了解的知识比较少。

Jacob的使用方法:

首先--

1.在工程中导入 jacob.jar 这个包。
2.把 jacob.dll 拷贝到 jdkin或者C:WINDOWSsystem32目录下。
以上的两个文件您可以到网上http://danadler.com/jacob/ 下载的1.7的版本
jacob.jar 与 jacob.dll 版本一致。

3.注册ocx控件

l 先把***.ocx控件放入c:windowssystem32 文件夹下

l 在cmd命令行下,输入regsvr32 ***.ocx命令进行注册

Java代码:

1.初始化

ActiveXComponent com = new ActiveXComponent("组件的ProgID") ;

Dispatch disp = com.getObject();

2.调用控件里面的方面

2.1调用无参的方法,并返回一个short值

Dispatch.call(disp, "Init").getShort();

2.2调用有一个参数的方法,并返回一个boolean值

Dispatch.call(disp,"Method",new Variant(args)).getBoolean();

调用多个参数依次类推,注意在传递参数前,将Java中的参数转换成Variant。

bug解决:

1.java.lang.UnsatisfiedLinkError: no jacobin java.library.path

原因是:没有把 jacob.dll 拷贝到 jdkin或者C:WINDOWSsystem32目录下

2.Exception in thread "main" com.jacob.com.ComFailException: Can't get object clsid from progid

原因是:regsvr32 ***.ocx命令进行注册后 ,获取的progid有误;

3.

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:544)

at com.lv.office.AIPToTest.jacob(AIPToTest.java:24)

at com.lv.office.AIPToTest.main(AIPToTest.java:14)

原因是:

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

免责声明:文章转载自《Java调用ocx控件以及dll》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇js读取解析JSON类型数据(转)php 7.2 安装 mcrypt 扩展: mcrypt 扩展从 php 7.1.0 开始废弃;自 php 7.2.0 起,会移到 pecl下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JS调用Delphi编写的OCX控件

原文:http://www.mamicode.com/info-detail-471283.html 一、使用Delphi XE2编写OCX控件   生成OCX工程:   1、File-New-Other,在New Items对话框中选择Delphi Projects-ActiveX-ActiveX Library   2、File-New-Ot...

关于Active控件的电子签名

两种方案:一是自己制作证书,客户端安装证书后就可以识别该控件;二就是买官方的喽,在国内找verisign的代理,负责各种电子签名,任何一台浏览器都可以识别该证书。该公司官方网址:http://www.verisign.com/products-services/security-services/code-signing/digital-ids-code-s...

vc6.0 调用ocx控件

打开Project->Add to project->Components and Controls选项,选择Registered ActiveX Controls文件并双击,找到Microsoft MonthView Control 6.0 (SP6),单击选择它,然后点击Insert按钮。如下图。。ActiveX控件简介 Acti...

无法使用MSHFLXGD.OCX控件的一个解决办法

朱金灿 一次在VS 2005编的一个程序上无法使用MSHFLXGD.OCX控件(具体症状是当要使用该控件时出现程序崩溃)。开始以为MSHFLXGD.OCX控件没有注册,使用regsvr32进行注册,但是注册成功后依然无法使用。于是上网搜索资料,大致知道了原因:原来是微软的OCX控件大多需要许可证,有了分发许可证的控件才可以正常运行。 按照网上的说法是:...

VC++ 6.0 中使用 MSComm.ocx

很多人喜欢单独安装VC++6.0,而不是完整安装VS,这样占用空间比较少,启动也快。但是要使用某些ActiveX控件的时候却会出现许可证问题(requires a design-time licence),譬如使用MSComm.ocx。至于ActiveX的许可证体系这里就不说了,简单说就是用来保证第三方ActiveX控件开发者的智力投资的。MSComm.o...

ActiveX控件打包cab时INF文件的编写[转]

虽然微软对ActiveX越来越不信任,但是这个技术还是很多人喜欢用的,这个博客的编辑器貌似就用到了ActiveX。 在我们编写好ocx控件后只有在打包成CAB文件加入数字签名后才能正常发布,如果你用的是vc6,那么问题简单了,打包完成后不用考虑控件的运行库问题,现在的XP系统和将要淘汰的2kpro都已经有了这样的运行库。但是如果使用的是.net2005就会...