java 通过 JACOB 调用 ocx

[转载]

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

 

Jacob的使用方法:

 

首先--

 

1.在工程中导入 jacob.jar 这个包。
2.把 jacob.dll 拷贝到 jdk\bin或者C:\WINDOWS\system32目录下。

以上的两个文件您可以到网上
http://danadler.com/jacob/ 下载的1.7的版本
jacob.jar 与 jacob.dll 版本一致。

3.注册ocx控件

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

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

 

Java代码:

1.初始化 

ActiveXComponent com = new ActiveXComponent("classid:") ;

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 jacob in java.library.path

原因是:没有把 jacob.dll 拷贝到 jdk\bin或者C:\WINDOWS\system32目录下

 

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

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

 

3.

 

 

 

 

原因是:

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

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java通过Jacob可以轻松调用Bartender。Bartender是一款强大的条码标签打印软件,而Jacob是连接Java和Microsoft Office的一种技术。Java可以使用Jacob的API,通过COM接口来调用Bartender的应用程序程序接口(API)。这可以让Java应用程序使用Bartender的打印功能,从而生成和打印条形码标签。最常用的方法是使用Jacob的Dispatch类和Method类,来调用Bartender的API命令,从而实现打印功能。同时,Java和Bartender都支持自定义的脚本和代码,因此可以更加灵活地实现打印的业务逻辑。通过JavaJacob的结合,实现了Bartender和其他应用程序的打印功能的集成,为工业、物流等领域的数据采集和信息管理提供了可靠的技术支持,使得企业的生产管理变得更加高效。 ### 回答2: Bartender是一个条码标签打印软件,而jacobJava COM桥接器,可以将Java程序与COM组件进行通信。使用jacob可以在Java程序中调用Bartender的COM 接口,进而实现打印条码标签等功能。 首先,需要下载jacob库并在Java工程中导入相关的jar包。然后,需要安装Bartender软件并通过其开放的COM接口。对于Bartender的COM接口,需要在Bartender的菜单栏中选择“文件”→“打印”→“COM打印对象设置”来打开COM设置窗口。在其中选择“启用COM对象”并保存。 接下来,在Java程序中实现调用Bartender的步骤如下: 1. 创建jacob的ActiveXComponent对象,指定Bartender的COM对象ID“Bartender.Application”。 2. 使用对象方法调用Bartender的COM接口,例如设置打印模板、设定数据源等。 3. 调用jacob的Variant对象,将参数传递给Bartender的COM接口。 4. 调用jacob的Dispatch.call方法传递方法名和参数,实现调用Bartender的COM接口。 示例代码如下: // 创建ActiveXComponent对象 ActiveXComponent bartender = new ActiveXComponent("Bartender.Application"); // 指定模板和数据源 bartender.invoke("Open", new Variant("标签模板")); bartender.invoke("SetNamedSubStringValue", new Variant("数据源名称"), new Variant("数据源值")); // 设定打印机 bartender.setProperty("Printer", new Variant("打印机名称")); // 执行打印 bartender.invoke("StartPrintJob"); bartender.invoke("PrintOut", new Variant(false)); bartender.invoke("CancelPrintJob"); 通过上述方法,我们可以使用Java程序调用Bartender的COM接口,在Java程序中实现打印标签等功能。需要注意的是,Bartender的COM接口需要有相应的权限才能被调用,因此需要确保用户的权限设置正确。同时,也需要按照Bartender的COM接口文档使用正确的方法和参数,才能成功调用Bartender的接口。 ### 回答3: Java 通过jacob调用Bartender是一个常见的需求,Bartender是一款非常流行的标签设计和打印软件。jacobJava的COM桥接器,它可以让Java程序通过COM接口调用Windows平台下的各种COM组件,比如Bartender。下面我们将详细介绍Java通过jacob调用Bartender的步骤。 首先我们需要下载jacob,并添加到Java工程的类路径中。接着我们需要在Java程序中编写Bartender调用的代码。在Java程序中,我们可以通过jacob来连接COM对象,后面的操作跟普通的Java操作一样,包括设置打印参数、调用打印方法等等。 下面是一个简单的Java代码示例,展示如何通过jacob调用Bartender: ```java public class BartenderService { private ComServer bartend; public BartenderService(String bartenderPath) { bartend = new ComServer(); if (bartend.init(bartenderPath)) { return; } throw new RuntimeException("failed init bartender"); } public void printLabel(String filePath, String labelName, Map<String,String> fieldValues) { bartend.call("Format.FileOpen", filePath, true, ""); bartend.call("Document.Open", labelName); for (Map.Entry<String,String> entry : fieldValues.entrySet()) { bartend.setProperty("Document.Variables(\"" + entry.getKey() + "\")", entry.getValue()); } bartend.setProperty("Document.PrinterSetup.PrinterName", "your-printer-name"); bartend.call("Document.PrintLabel", 1, 1); } } ``` 在这个代码示例中,我们定义了一个BartenderService类,它初始化时需要传入Bartender的安装路径。在打印标签时,我们会调用printLabel方法,传入标签文件路径、标签名称和打印参数。这个方法会打开文件、打开标签、设置打印参数和变量(即标签中的占位符),最后调用打印方法来完成打印操作。 总的来说,Java通过jacob调用Bartender是非常方便的,只需要简单地编写几十行代码,就可以实现标签的设计和打印。如果您在工作中有相关需求,建议尝试一下这个技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值