调度没有挂钩到Windows内存

时间:2012-10-13 07:55:13

标签: jacob

有时我会收到错误(例外):

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

}

1 个答案:

答案 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。