java jacob ocx_JAVA通过jacob调用ocx
下载jacob包
这个包中有jacob-1.17-M2-x64.dll和jacob-1.17-M2-x86.dll两个dll和jacob.jar一个jar包,两个dll一个是64位一个是32位,这个对应的是jdk,不是指系统
Jacob包放置位置
如果系统是64位的就将dll文件放到C:\Windows\SysWOW64下,如果系统是32位的就将dll文件放到C:\Windows\System32下
Jar文件可以放到jdk下也可以加载到自己工程的外部jar包,我是加载到工程中的
注册ocx插件
注册ocx插件,建议64位系统放到C:\Windows\SysWOW64下,32位系统放到放到C:\Windows\System32下,
打开命令行,通过命令regsvr32C:\Windows\SysWOW64\mc2.ocx进行注册,C:\Windows\SysWOW64\为放置ocx的目录,mc2.ocx为ocx名称,注册成功失败都会有窗口提示,这是windows的事情,此处不再说明。
卸载注册命令可以用regsvr32 /uC:\Windows\SysWOW64\mc2.ocx
新建java工程
新建java工程,将jacob.jar放到工程中新建的lib目录下,右键工程名打开配置环境变量窗口,导入jar包
代码举例
package com.hsh.ocx;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.activeX.ActiveXDispatchEvents;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.DispatchEvents;
import com.jacob.com.InvocationProxy;
import com.jacob.com.Variant;
public class JavaOcx {
public static void main(String[] args) throws InterruptedException {
//HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{74E58985-15BD-483D-A281-4F6D4BB6387E}
ComThread.InitMTA(true);
// 通过ProgID调用OCX控件,组件的ProgID对应注册表中mc2.ocx注册后的ProgID值,可以打开注册表查找ocx文件名找到对应的值
//ActiveXComponent com = new ActiveXComponent("组件的ProgID") ;
ActiveXComponent com = new ActiveXComponent("MC2.Mc2Ctrl.1") ;
//通过CLSID调用OCX控件
//ActiveXComponent com = new ActiveXComponent("CLSID:74E58985-15BD-483D-A281-4F6D4BB6387E") ;
Dispatch disp = (Dispatch) com.getObject();
/**
先调用Init方法进行初始化
[id(1)] long Init(BSTR AccountNo, BSTR Extno, BSTR Password);
既可以用接口名称"Init"调用,也可以用id(1)来调用
Init为ocx插件中对应的方法名,accountno,extno,password为该方法中对应的参数
*/
String accountno="*********";
String extno = "**";
String password = "******";
int Init = Dispatch.call(disp,"Init",new Variant(accountno),new Variant(extno),new Variant(password)).getInt();
//int Init = Dispatch.call(disp,"Init",accountno,extno,password).getInt();//用接口名称"Init"调用
//int Init = Dispatch.call(disp,1,accountno,extno,password).getInt();//用id(1)来调用
System.out.println("初始化结果为"+Init);
//初始化后需要等一下,不能马上调用其他接口,所以这里加了延时以等待初始化结束
Thread.sleep(3000);
//调用isLogin接口查看是否还在登录状态,只有在登录状态才可进行其他操作
//[id(1)] LoginEvent(iStatus,szVoipNo,szServiceTel);
Boolean isLogin2 = Dispatch.call(disp,2).getBoolean();
System.out.println("登录结果为"+isLogin2);
If(isLogin2){
//[id(11)]long SendShortMessage(BSTR szRecvTelNo, BSTR szContent);
int SendShortMessage = Dispatch.call(disp,11,"********","********").getInt();
System.out.println("短信发送结果为"+SendShortMessage);
}
//释放线程
ComThread.Release();
}
}
问题总结
常见的几个错误
1、java.lang.UnsatisfiedLinkError: no jacob in java.library.path
这个是没有找到jacob.dll,需要把对应的dll放到对应目录下
2、Exception in thread "main" com.jacob.com.ComFailException: Can't get object clsid from progid
这个应该是注册表中找到的progid不对,检查一下
3、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)
原因是:这个错误是由ActiveX结构设计造成的。
在Ole4.0版本之前,外部程序是可以直接调用OCX中方法的。Ole4.0之后,每次调用控件中的方法,系统会自动检查是否答应调用,即运行COleControl.IsInvokeAllowed (DISPID)
该方法检查控件是否正确的初始化或者是否通过持久存储接口正确加载,假如两个条件有一个满足,即返回TRUE,否则返回FALSE。
当控件在MFC中使用时,很多细节,如初始化,都被过滤了,这样,大多数用户都不会碰到这个题目。但是,当我们从C、C++的dll中调用控件时,不满足上述条件,该方法返回FALSE,这时候再调用任何控件方法,都会出现上述异常。
在OCX控件中,重写COleControl.IsInvokeAllowed (DISPID)方法,即在控件的CMyNameCtrl中增加一个方法
BOOL CMyNameCtrl::IsInvokeAllowed (DISPID)
{
return TRUE;
}
4、An unexpected error has been detected by Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x77c9e3be, pid=1140, tid=4900
#
# Java VM: Java HotSpot(TM) Client VM (11.3-b02 mixed mode windows-x86)
# Problematic frame:
# C [ntdll.dll+0x2e3be]
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
这个应该是jacob版本问题,我开始用的一个jacob报这错误,后下载了新版本的重试就可以了
java jacob ocx_JAVA通过jacob调用ocx相关推荐
- java jni ocx_Java调用ocx控件以及dll
[ 通过Java调用OCX控件有几种方法,JNI.JACOB.Jawin等 1.JNI 最直接的方式,也是最麻烦的方式,需要自己完成所有的工作,不推荐. 2.Jawin 尝试了一下,效果不错,但相 通 ...
- Java基于VB通过Jacob调用AutoCAD接口
Java 以跨平台深受大家喜欢,而由于它跨平台的目的,需要运行在java虚拟机上工作,使得它和本地机器各种内部联系变得很少,约束了它直接掉本地API的功能.本例采用VB代码生成调用AutoCAD接口的 ...
- Java调用ocx控件以及dll
2019独角兽企业重金招聘Python工程师标准>>> http://lvqingboy-163-com.iteye.com/blog/769358 通过Java调用OCX控件有几种 ...
- java ocx调用_Java调用ocx控件以及dll
下载jacob包 这个包中有jacob-1.17-M2-x64.dll和jacob-1.17-M2-x86.dll两个dll和jacob.jar一个jar包,两个dll一个是64位一个是32位,这个对 ...
- java调用ocx控件获取数据_Java调用ocx控件以及dll
通过Java调用OCX控件有几种方法,JNI.JACOB.Jawin等 1.JNI 最直接的方式,也是最麻烦的方式,需要自己完成所有的工作,不推荐. 2.Jawin 尝试了一下,效果不错,但相对来说, ...
- jacob java excel_12、借助Jacob实现Java打印报表(Excel、Word)
12.使用Jacob来处理文档 Word或Excel程序是以一种COM组件形式存在的.如果能够在Java中调用相应组件,便能使用它的方法来获取文档中的文本信息.Jacob是一个JAVA到微软的COM接 ...
- java通过POI和jacob实现word文档的在线预览和下载
通过POI和jacob可以实现word文档的在线预览和下载. 首先,引入以下maven依赖. <dependency><groupId>org.apache.poi</g ...
- java.lang.UnsatisfiedLinkError: com.jacob.com.D...
2019独角兽企业重金招聘Python工程师标准>>> 最近做一个系统的维护改善工作,从来没接触过的业务,代码中没有一句注释.各种bug堆积转狂. 一条改到导出word的功能的时候, ...
- java使用jacob.jar_java使用jacob.jar将word转pdf
本文实例为大家分享了java利用jacob.jar将word转pdf的具体代码,供大家参考,具体内容如下 1.jacob.jar配置说明 JACOB 就是 JAVA-COM Bridge的缩写,提供自 ...
最新文章
- TVM性能评估分析(六)
- ISME:菌根真菌菌丝分泌物中的果糖作为信号激发解磷细菌活化植酸
- pytorch中tensor的unsqueeze()函数和squeeze()函数的用处
- win32下PE文件分析之节表
- 异常检测——局部异常因子(Local Outlier Factor ,LOF)算法
- oracle质数怎么算,借花献佛之使用Oracle sql求质数(笔记)
- 做了表分区以后的数据库表,在使用程序进行修改操作时报异常。
- [剑指offer]面试题22:栈的压入、弹出序列
- 摄像头取景框_苹果11的「超取景框拍摄照片」,很多人都不知道怎么用
- 力扣题目系列:290. 单词规律
- 域名被封(微信)后的思索
- 惠普台式计算机耳机插口,hp电脑耳机插孔没声音的解决方法
- spring cloud入门组件教程
- 办公自动化oa按计算机分类,办公室自动化oa按计算机分类属于什么
- win10硬盘锁怎么解除_电脑磁盘加密了怎么解密_win10如何关闭硬盘加密
- 相册服务器维护,相册云服务器
- 3060ti配什么cpu和主板
- 笔记本“电源已接通,未充电”的解决办法 win7
- 交通灯管理系统视频学习
- Quartus-建立新工程
热门文章
- 强化学习-把元学习(Meta Learning)一点一点讲给你听
- android模拟器中使用SDCard
- 计算机最基本的硬件配置,详细的Windows 10计算机硬件配置要求和最低配置
- 网络设置巨形帧_网卡设置 网卡的高级设置说明
- Struts2通配符映射/Struts action name=/*/* method={2} class=com.jxc.action.{1}Action 		 result
- 电视剧 | 黑镜S5E1 生死搏击
- OneNav一为主题魔改教程(三):给底部加上当前页面的消耗时间--洞五洞洞幺
- python脚本下载百度或必应图片
- openoffice安装及使用,linux文件资源下载及windows资源下载
- QQ拼音直接提权WIN8