java - 调用 .OCX 方法的 JACOB 灾难性故障

标签 java ocx jacob

您好,我目前的任务是转换旧版 Visual Basic 6 应用程序,该应用程序通过第三方应用程序 XFS.ocx(无源)与 Passbook 打印机通信。

根据我的研究,我可以让 JACOB 完成这项任务,但我遇到了一个错误。谁能帮我?根据日志,我的程序可以实例化 activeX 组件并查看我想要使用的方法的 ID,但是当我尝试使用它们时遇到错误。

在我用作指南的示例 VB6 代码中,方法 VersionRequired 需要两个整数作为参数,而 ApplicationID 只需要一个字符串。

希望我只是在使用的语法或 JACOB 方法上犯了错误,因为我只想将 java JNI 作为最后的手段。请注意此应用程序将始终安装在 Windows (7/10) 工作站中,因此其他操作系统兼容性不是问题。

这是我的代码

ActiveXComponent activeXComponent = new ActiveXComponent("XFS.XFSCtrl.1");


System.out.println( activeXComponent.getIDOfName(activeXComponent, "ApplicationID"));
System.out.println( activeXComponent.getIDOfName(activeXComponent, "VersionRequired")); 
System.out.println( activeXComponent.getIDOfName(activeXComponent, "Description"));
System.out.println( activeXComponent.getIDOfName(activeXComponent, "Open"));

//Variant variant = activeXComponent.call(activeXComponent, "VersionRequired",1,1);
//Variant variant = activeXComponent.call(activeXComponent, "Description"); // added 072318 for David answer
//Variant variant = activeXComponent.getProperty("Description");
//activeXComponent.setProperty("Description", "Description");
//Variant variant = activeXComponent.get(activeXComponent,"Description");
activeXComponent.call(activeXComponent, "Description", "value");

这是我遇到的日志和错误

WARNING: JNI local refs: zu, exceeds capacity: zu
    at java.lang.System.initProperties(Native Method)
    at java.lang.System.initializeSystemClass(System.java:1166)
main: Loading library jacob-1.19-x86 using System.loadLibrary 
main: Loading library jacob-1.19-x86 using System.loadLibrary 
main: Loading library jacob-1.19-x86 using System.loadLibrary 
main: ComThread: before Init: 0
main: ComThread: after Init: 0
main: ROT: Automatic GC flag == false
main: ComThread: after ROT.addThread: 0
main: ROT: adding com.jacob.activeX.ActiveXComponent@11d50c0->com.jacob.activeX.ActiveXComponent table size prior to addition:0
13
31
1
21
main: ROT: adding ->com.jacob.com.Variant table size prior to addition:1
main: ROT: adding ->com.jacob.com.Variant table size prior to addition:2
main: ROT: adding ->com.jacob.com.Variant table size prior to addition:3
main: ROT: adding ->com.jacob.com.Variant table size prior to addition:4
main: ROT: adding ->com.jacob.com.Variant table size prior to addition:5
Exception in thread "main" com.jacob.com.ComFailException: A COM exception has been encountered:
At Invoke of: Description
Description: 8000ffff / Catastrophic failure

    at com.jacob.com.Dispatch.invokev(Native Method)
    at com.jacob.com.Dispatch.invokev(Dispatch.java:625)
    at com.jacob.com.Dispatch.callN(Dispatch.java:453)
    // at com.jacob.com.Dispatch.get(Dispatch.java:788) // added 072318 when using activeXComponent.get(activeXComponent,"Description")
    at com.jacob.com.Dispatch.call(Dispatch.java:541)
    // at com.jacob.com.Dispatch.call(Dispatch.java:529) // added 072318 for David answer
    at ph.com.bdo.icos.passbook.Launcher.main(Launcher.java:32)

我用作引用的 VB 代码

  With XFS1
        'Set up the versions required of XFS and SP
        .VersionRequired(WFS_VERSREQ_OLE, WFS_VERSREQ_LOW) = 1#   ' 2.00
        .VersionRequired(WFS_VERSREQ_OLE, WFS_VERSREQ_HIGH) = 2#  ' 2.00
        .VersionRequired(WFS_VERSREQ_API, WFS_VERSREQ_LOW) = 1.01
        .VersionRequired(WFS_VERSREQ_API, WFS_VERSREQ_HIGH) = 2#
        .VersionRequired(WFS_VERSREQ_SRV, WFS_VERSREQ_LOW) = 1.01
        .VersionRequired(WFS_VERSREQ_SRV, WFS_VERSREQ_HIGH) = 2.1
        'Get back one of the values for testing
        fResult = .VersionRequired(WFS_VERSREQ_API, WFS_VERSREQ_LOW)

        'Set and Get the Application property for testing
        .ApplicationID = "Passbook Printer"
        sAppID = .ApplicationID
        sDescription = .Description

最佳答案

我的猜测是 Description 是一个只读属性,而不是一个函数

因此您不能对其使用调用,并且此代码会出错,产生灾难性故障(COM 错误一直是模糊的):

activeXComponent.call(activeXComponent, "Description", "value");

如消息日志所述:

线程“main”com.jacob.com.ComFailException 中的异常:遇到 COM 异常:在调用时:描述

而且您也不能设置属性,因为它是只读的:

activeXComponent.setProperty("Description", "Description");

实际上,如果您正确阅读了 VB6 代码,Description 属性只是被读取了

sDescription = XFS1.Description

试试这个:

Variant v = activeXComponent.call(activeXComponent, "Description"); 字符串描述 = v.toString();

关于java - 调用 .OCX 方法的 JACOB 灾难性故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51298469/

相关文章:

java - 如何在 webview 中加载内部链接?

java - 在 Spring Boot 应用程序的 REST 调用中接受 Enum 的空字符串

java - 使用 Java 无法正确复制文件

.net - .ocx 文件和 .Net 控件之间的区别

java - Jacob Com Outlook 使用 Dispatch.call 发送邮件

Java with JACOB - 如何正确设置 Java 库路径

java - 从java打开一个URL

wpf - Windows 7 x64 上的闪存 ocx "Class not registered"

Java 和 Autoit 无法发送 TAB、ENTER 等按键?