下载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下,

打开命令行,通过命令regsvr32 C:\Windows\SysWOW64\mc2.ocx进行注册,C:\Windows\SysWOW64\为放置ocx的目录,mc2.ocx为ocx名称,注册成功失败都会有窗口提示,这是windows的事情,此处不再说明。

卸载注册命令可以用regsvr32/u C:\Windows\SysWOW64\mc2.ocx

新建java工程

新建java工程,将jacob.jar放到工程中新建的lib目录下,右键工程名打开配置环境变量窗口,导入jar包

代码举例

packagecom.hsh.ocx;

import com.jacob.activeX.ActiveXComponent;

importcom.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 {

publicstatic 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文件名找到对应的值

//ActiveXComponentcom = new ActiveXComponent("组件的ProgID") ;

ActiveXComponentcom = new ActiveXComponent("MC2.Mc2Ctrl.1") ;

//通过CLSID调用OCX控件

//ActiveXComponentcom = new ActiveXComponent("CLSID:74E58985-15BD-483D-A281-4F6D4BB6387E") ;

Dispatchdisp = (Dispatch) com.getObject();

/**

先调用Init方法进行初始化

[id(1)] long Init(BSTR AccountNo, BSTR Extno,BSTR Password);

既可以用接口名称"Init"调用,也可以用id(1)来调用

Init为ocx插件中对应的方法名,accountno,extno,password为该方法中对应的参数

*/

String accountno="*********";

Stringextno = "**";

Stringpassword = "******";

intInit = Dispatch.call(disp,"Init",new Variant(accountno),newVariant(extno),new Variant(password)).getInt();

//intInit =Dispatch.call(disp,"Init",accountno,extno,password).getInt();//用接口名称"Init"调用

//intInit = 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(BSTRszRecvTelNo, BSTR szContent);

intSendShortMessage = Dispatch.call(disp,11,"********","********").getInt();

System.out.println("短信发送结果为"+SendShortMessage);

}

//释放线程

ComThread.Release();

}

}

问题总结

常见的几个错误

1、java.lang.UnsatisfiedLinkError: no jacob injava.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: 灾难性故障

atcom.jacob.com.Dispatch.invokev(Native Method)

atcom.jacob.com.Dispatch.invokev(Dispatch.java:804)

atcom.jacob.com.Dispatch.callN(Dispatch.java:440)

atcom.jacob.com.Dispatch.call(Dispatch.java:510)

atcom.vflow.sms.InitOcxFunctions.isLogin(InitOcxFunctions.java:36)

atcom.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 JavaRuntime 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 JavaVirtual Machine in native code.

# See problematic frame for where to reportthe bug.

#

这个应该是jacob版本问题,我开始用的一个jacob报这错误,后下载了新版本的重试就可以了

java ocx调用_Java调用ocx控件以及dll相关推荐

  1. 做VB的,经常注册和反注册OCX控件和DLL链

    做VB的,经常注册和反注册OCX控件和DLL链 但是,每次都要 "开始"--"运行" --"regsvr32 C:\********\******.o ...

  2. java jni ocx_Java调用ocx控件以及dll

    [ 通过Java调用OCX控件有几种方法,JNI.JACOB.Jawin等 1.JNI 最直接的方式,也是最麻烦的方式,需要自己完成所有的工作,不推荐. 2.Jawin 尝试了一下,效果不错,但相 通 ...

  3. VFP调用Windows Media Player控件播放音乐、视频等

    *--VFP调用Windows Media Player控件播放音乐.视频等 *--控件名称:Windows Media Player *--控件文件名:wmp.dll *--控件ProgID:WMP ...

  4. vlc集成c#_C# Winform开发程序调用VLC播放器控件播放视频.

    VLC是个好东西,支持的格式多,还无广告,关键还有调用它的播放控件不用安装. 开个文章记录下调用这个控件的流水账,以便以后需要的时候查阅 创建工程 首先新建一个Winform工程. 这里姑且叫做VLC ...

  5. qt中利用普通函数将调用ui界面的控件

    一.新建qt程序,界面如图所示: 二.在.h文件中: #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #in ...

  6. java多文件上传plupload控件实现多图片上传(二)

    接上篇 java多文件上传plupload控件实现多图片上传(一) 续写PluploadUtil 和 Plupload PO类,以及后台的action. 至此,可实现多文件上传功能. 上传文件Acti ...

  7. ASP.NET2.0 分页控件 PagerPro.dll (1.1.0 最新)

    快来瞧,快来看了啊,新出炉的ASP.NET分页控件,热乎啦! 最新的ASP.NET2.0分页控件,经过对样式的处理,现有None和Standard两种样式,可以自定义是否显示Page Count 和 ...

  8. java调用ocx控件获取数据_Java调用ocx控件以及dll

    通过Java调用OCX控件有几种方法,JNI.JACOB.Jawin等 1.JNI 最直接的方式,也是最麻烦的方式,需要自己完成所有的工作,不推荐. 2.Jawin 尝试了一下,效果不错,但相对来说, ...

  9. Java调用ocx控件以及dll

    2019独角兽企业重金招聘Python工程师标准>>> http://lvqingboy-163-com.iteye.com/blog/769358 通过Java调用OCX控件有几种 ...

最新文章

  1. 这是给程序员专用的书吗?
  2. 一个Java快速排序实现的调试
  3. [机器学习-Sklearn]决策树学习与总结 (ID3, C4.5, C5.0, CART)
  4. 关于Markdown编辑器怎么写“|”等特殊符号的问题
  5. oracle r11,Oracle XML Publisher在Oracle R11i中的实际运用
  6. 感觉自己应该重新读一次Javascript
  7. beini安装破*WIFI
  8. win7设置背景色保护视力
  9. ai作文批改_网易有道词典再推AI作文批改新功能
  10. 永远不会被杀毒软件查杀的木马捆绑机
  11. 9月25日百度大脑开放日人像特效专场火热报名中!
  12. 解决用电脑连接宽带给手机开热点的问题
  13. LC-3指令集 字符的输入与输出
  14. 平台消息推送是如何实现的
  15. android app被系统回收后重启异常的解决方法
  16. Chrome安装插件提示 出现错误 image decode failed
  17. 践行绿色发展理念,产业园区绿色转型发展之五大路径
  18. hydra笔记-利用hydra暴力破解ssh弱口令
  19. ios dat 文件读写_树莓派安装Samba服务,实现家庭文件共享
  20. CentOS7vim修改文件/bin/bash: wq command not found问题解决

热门文章

  1. html中文本框的透明度,jQuery实现textarea文本框半透明文本提示效果
  2. anaconda配置h5py===2.10.0
  3. 评选最牛群主v1.0(哈工大Mooc)
  4. Java并发(四)BlockingQueue的使用
  5. xp安全模式下如何修复计算机,电脑怎么进入安全模式,教您xp系统进入安全模式的方法...
  6. java 实现macd算法_java尝试编写macd,试验顶背离底背离
  7. 九度oj-1163-素数
  8. 综述:当医学影像遇上深度学习
  9. msata、mini pcie 、pcie x4接口引脚定义及原理图方案设计
  10. JavaScript整合版——后端程序员学js,只读一文直接零基础入门,大学生期末考试不挂科宝典。