`
zyp307
  • 浏览: 15327 次
  • 性别: Icon_minigender_1
  • 来自: 乌鲁木齐
社区版块
存档分类
最新评论

JAVA通过jacob调用ocx

    博客分类:
  • JAVA
阅读更多

下载jacob

网址http://sourceforge.net/projects/jacob-project/?source=directory

这个包中有jacob-1.17-M2-x64.dlljacob-1.17-M2-x86.dll两个dlljacob.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.ocxocx名称,注册成功失败都会有窗口提示,这是windows的事情,此处不再说明。

卸载注册命令可以用regsvr32 /u C:\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(); 
}
 
}

 

 

问题总结

常见的几个错误

1java.lang.UnsatisfiedLinkError: no jacob in java.library.path

这个是没有找到jacob.dll,需要把对应的dll放到对应目录下

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

这个应该是注册表中找到的progid不对,检查一下

3Exception 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中使用时,很多细节,如初始化,都被过滤了,这样,大多数用户都不会碰到这个题目。但是,当我们从CC++dll中调用控件时,不满足上述条件,该方法返回FALSE,这时候再调用任何控件方法,都会出现上述异常。

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

BOOL CMyNameCtrl::IsInvokeAllowed (DISPID)

 {

 return TRUE;

 } 

4An 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.rar

    Java通过Jacob调用OCX是一种跨平台的技术,用于在Java应用程序中与Windows特定的ActiveX控件(OCX)交互。这项技术的核心是Jacob库,它是一个Java到COM桥接器,允许Java代码直接调用COM组件,如OCX控件。以下是对这...

    通过 JACOB 实现 Java调用ocx控件

    本文将详细探讨如何通过JACOB在Java中调用OCX控件,以MSCOMM32.OCX为例进行说明,并提供相应代码示例。 首先,了解JACOB的开发环境配置是关键。在Windows平台上,通常需要64位和32位的DLL文件支持,以适应不同版本...

    jacob/js调用ocx控件的demo

    - `*.java`: 示例Java代码,展示如何使用Jacob调用OCX。 - `*.html`: HTML页面,包含JavaScript调用OCX控件的代码。 - `*.ocx`: 自定义开发的OCX控件文件。 - `readme.txt`: 可能包含运行和配置的指南。 通过深入...

    java的jacob调用OCX

    描述中强调了在Java中通过Jacob调用OCX组件时,错误处理的重要性。在使用Jacob桥接技术过程中可能会遇到各种错误,比如COM对象无法加载、方法调用失败、类型转换错误等,需要妥善处理这些异常情况,确保程序的稳定性...

    java调用ocx控件,jacob,jar和dll文件

    Java调用OCX控件是跨平台编程中的一项技术挑战,因为OCX(Object Linking and Embedding Control)是微软Windows环境下的组件对象模型(COM)控件。然而,通过第三方库如Jacob(Java和COM的桥梁),Java开发者能够在...

    jacob调用OCX控件总结

    Java 调用 OCX 控件是一个常见的需求,...总之,通过Jacob调用OCX控件可以简化跨平台的Java开发工作,但需要注意适配不同操作系统和解决可能出现的异常。在实际项目中,根据需求和团队技术栈选择合适的方法进行集成。

    jacob调用ocx控件灾难性故障

    在描述中提到的问题是,当尝试通过JACOB调用OCX控件时,会抛出`com.jacob.com.ComFailException`,异常信息为“灾难性故障”。这可能是因为在Ole4.0之后,COM调用增加了安全检查,即`COleControl.IsInvokeAllowed...

    Java通过Jacob调用ActiveX,进行二进制数据交换

    该工程项目演示了Java通过jacob1.17调用ActiveX的基本方法。对于单个的基本类型的数据(byte、short、long、BOOL)等类型的数据,以及有很多字节组成的可见英文字符、汉字等组成的字符串(LPCTSTR、BSTR类型都会进行...

    JAVA-dll-ocx.rar_Java调用dll_dll ocx_java EdisonSmsGw.ocx_java 调用o

    在"javacom"这个压缩包的子文件中,可能包含了使用JNI或JNA进行DLL调用,以及使用JACOB等工具调用OCX控件的Java源码示例。通过分析这些示例,开发者可以学习如何在实际项目中实现类似的集成。 总结起来,这个压缩包...

    java调用dll和ocx的开源控件

    Java调用DLL和OCX是跨语言交互的一个重要应用场景,主要涉及到Java的本地接口(Java Native Interface,JNI)和第三方库如Jacob项目。Jacob是一个Java和COM(Component Object Model)之间桥梁的开源库,它允许Java...

    jacob技术开发文档

    java调用ocx控件的方法,jacob技术调用ocx控件的步骤、流程,java项目调用具体代码,java调用ocx控件参数传递,jacob调用ocx控件常见bug解决办法,并且附上了java调用word控件的demo代码

    JACOB各版本下载

    3. **编写代码**: 使用JACOB时,首先需要加载COM组件,然后通过Java对象来调用OCX控件的方法。例如,你可以使用`ActiveXComponent`类创建一个OCX实例,然后调用其方法,就像操作Java对象一样。 ```java import ...

    jacob-1.14.3-x64_x86.zip

    使用这些文件时,开发者需要将JAR添加到Java项目的类路径中,并根据操作系统选择相应的JNI库,然后就可以在Java代码中通过Jacob的API来调用OCX和DLL了。 总的来说,Jacob是Java开发者处理.NET世界的一个强大工具,...

    jacob操作office文档大全

    在 Java 中调用 OCX 控件有多种方法,例如 JNI(Java Native Interface)、Jawin 和 Jacob。JNI 需要开发者自行完成大量工作,相对复杂,不建议初学者使用。Jawin 的编程风格接近 Windows API,与 Java 语言特性有...

    jacob-1.20 jacob-1.19 jacob-1.17

    以下是使用Jacob调用OCX的基本步骤: 1. 引入Jacob库:首先,需要将`jacob-x.x.x.jar`文件添加到项目的类路径中,x.x.x表示Jacob的版本号,如1.20、1.19或1.17。 2. 创建`com.jacob.com.ComThread`实例:Jacob使用...

    jacob1.18源码和jar包

    调用jacob dll内的方法 比如:Dispatch java就通过LibraryLoader和Dispatch h Dispatch cpp建立联系 从而建立起java到jacob dll到jni的之间的联系 LSH 调用Microsoft MediaPlayer等 )">JACOB里的总共有两个包:...

    jacob-1.17-M2.rar

    《使用Jacob库在Java中调用OCX控件详解》 在Java开发中,有时我们需要与Windows系统的组件进行交互,例如使用ActiveX控件(OCX)。这时,一个强大的工具——Jacob(Java to COM Bridge)就能派上用场。Jacob项目...

    jacob1.18源码+jar包

    调用jacob dll内的方法 比如:Dispatch java就通过LibraryLoader和Dispatch h Dispatch cpp建立联系 从而建立起java到jacob dll到jni的之间的联系 LSH 调用Microsoft MediaPlayer等 )">JACOB里的总共有两个包:...

    jacob大全-java操作office

    通过Java调用OCX控件使用Jacob非常方便,Java编程风格,需要了解的知识比较少。

    jacob-1.17-M2(支持64位和32位)

    4. 使用JACOB提供的API,通过Java代码调用OCX控件的方法和属性。 例如,如果你想要通过JACOB操作Microsoft Word,你可以创建一个`ActiveXComponent`对象,然后调用其`createInstance`方法来实例化Word应用,再...

Global site tag (gtag.js) - Google Analytics