有时我会收到错误(例外):
java.lang.IllegalStateException: Dispatch not hooked to windows memory
这是什么意思?怎么预防呢?
这是导致此错误的示例代码:
import com.jacob.activeX.*;
import com.jacob.com.*;
public class Hooked {
public static void main(String[] args) {
ActiveXComponent e = new ActiveXComponent("Excel.Application");
ActiveXComponent sh = new ActiveXComponent(
e.getProperty("ActiveSheet").toDispatch());
System.out.println(sh.getPropertyAsString("Name"));
}
}
答案 0 :(得分:3)
这意味着Dispatch
= nothing
使用vba语法,它是空的。您使用new Dispatch()
收到的同一个调度。不幸的是,雅各布1.17没有提供任何方法来明确检查Dispatch
是否为空。所以我看到了3个可能的解决方案:
1)在从COM调用接收Variant之后使用Variant.isNull()
,然后再将其转换为Dispatch。所以它还需要1行:
Variant vsh = e.getProperty("ActiveSheet");
if (vsh.isNull()) {
System.out.println("Null dispatch received.");
}
ActiveXComponent sh = new ActiveXComponent(vsh.toDispatch());
第一次使用可疑的Dispatch时, 2)抓住IllegalStateException
。
3)撰写自定义isNull(Dispatch d)
功能
public static boolean isNull(Dispatch d)
{
try {
Dispatch.call(d, "");
}
catch (IllegalStateException ise) {
return true;
}
catch (ComFailException cfe) {
// that's ok, we didn't expect this call to succeed
}
return false;
}
在问题的具体示例中,调用只是一个错误,因为如果没有打开或创建工作簿,Excel就没有ActiveSheet。