JACOB Катастрофическая ошибка, вызывающая метод.OCX

Привет! В настоящее время у меня есть задача преобразовать устаревшее приложение Visual Basic 6, которое взаимодействует с принтером Passbook через стороннее приложение XFS.ocx (без источника).

Основываясь на моих исследованиях, я смог JACOB выполнить эту задачу, но я столкнулся с ошибкой. Может кто-нибудь мне помочь? На основе журналов моя программа может создать экземпляр activeXcomponent и увидеть идентификатор методов, которые я хочу использовать, однако, когда я пытаюсь их использовать, я сталкиваюсь с ошибкой.

В примере кода 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

1 ответ

Я предполагаю, что 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");String description = v.toString();

Другие вопросы по тегам