java - 如何使用 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++)端以调试我的案例。那我会更新这个问题。
解决方案
如果那是输出参数,不应该是 'ByRef' 吗?
Sub GetMaterialOnBody (Body iBody, ByRef Material oMaterial)
在您的情况下,可能 GetMaterialOnBody sub 应该填充 oMaterial 对象的内部,而不是设置对它的引用?然后只需创建一个空的 Material 对象并传递给子
推荐阅读
- javascript - jQuery 菜单动画仅适用于第二次点击
- mysql - linux上的mysql问题以及从windows导入转储
- google-cloud-functions - 如何将属性从 Cloud Scheduler 传递到 Pub/Sub?
- flutter - Flutter:组合多个 Future
任务 - java - MemoryLeakMonitor.jar 不存在!(华为手机)
- django - Django - 可以直接在设置文件中从云服务加载秘密/密码/动态值吗
- python - (discord.py) 如何使我的 setprefix 命令正常工作?
- python - 在默认目录或每个单独项目的目录中创建 Conda 环境是更好的做法吗?
- python - 我无法在 Mac 中从 Python3 下载任何模块
- android-studio - 无法将任何虚拟设备连接到android studio