1

有时我会收到错误(异常):

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"));
  }

}
4

1 回答 1

3

这意味着Dispatch = nothing使用 vba 语法,它是空的。与您收到的相同调度new Dispatch()。不幸的是,Jacob 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());

2)第一次使用可疑Dispatch时捕获。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。

于 2012-10-15T06:25:16.553 回答