首页 > 解决方案 > 如何使用 Jacob 声明变量以将输出作为 Sub 参数

问题描述

我正在使用 Jacob 在软件中调用 VBA COM 接口。我需要调用一个具有输出参数的 Sub,该参数不是规范类型(int、String 等),而是在 .tlb 中声明的一些专用接口,这些接口随该软件一起提供。这里是

Sub GetMaterialOnBody (Body iBody, Material oMaterial)

所以我在调用中为输出参数材料尝试了许多声明和初始化,我得到了各种错误,似乎找不到正确的方法。

Variant material = new Variant (null, false);
Dispatch.invoke(materialManager.getDispatch(), "GetMaterialOnBody", Dispatch.Method, new Object[] {hybridBody, material}, new int[1]);

但得到了

com.jacob.com.ComFailException: A COM exception has been encountered:
At Invoke of: GetMaterialOnBody
Description: Type mismatch.

然后我尝试在材料上调用 .getDispatch()

Variant material = new Variant (null, false);
Dispatch.invoke(materialManager.getDispatch(), "GetMaterialOnBody", Dispatch.Method, new Object[] {hybridBody, material.getDispatch()}, new int[1]);

但得到了

java.lang.IllegalStateException: getDispatch() only legal on Variants of type VariantDispatch, not 0

所以我尝试了

Variant material = new Variant (null, false);
material.putNothing();
Dispatch.invoke(materialManager.getDispatch(), "GetMaterialOnBody", Dispatch.Method, new Object[] {hybridBody, material.getDispatch()}, new int[1]);

但得到了

com.jacob.com.ComFailException: putObject failed
at com.jacob.com.Variant.putVariantDispatch(Native Method) ~[jacob-1.14.3.jar:na]
at com.jacob.com.Variant.putDispatch(Variant.java:1341) ~[jacob-1.14.3.jar:na]

我尝试了不同的解决方案,包括使用 Ref 等。对于我们必须如何准确地初始化变体/调度以作为输出参数传递给 Sub。

有没有人知道如何做到这一点?我发现的关闭资源是处理字符串/整数而不是对象。

这个老问题可能是相关的(但显然没有答案):https ://community.oracle.com/tech/developers/discussion/1548970/jacob-out-parameters-refs-in-jni

我在 jacob github https://github.com/freemansoft/jacob-project/issues/23上提出了一个问题

我还给 github 上的项目所有者发了电子邮件,他说该项目已经休眠了一段时间。由于所有代码都可用,我将花时间编译和调试本机(C++)端以调试我的案例。那我会更新这个问题。

标签: javacomjacob

解决方案


如果那是输出参数,不应该是 'ByRef' 吗?

Sub GetMaterialOnBody (Body iBody, ByRef Material oMaterial)

在您的情况下,可能 GetMaterialOnBody sub 应该填充 oMaterial 对象的内部,而不是设置对它的引用?然后只需创建一个空的 Material 对象并传递给子


推荐阅读