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()Dispatch残念ながら、Jacob 1.17 はが空かどうかを明示的にチェックする方法を提供していません。だから私は3つの可能な解決策を見ます:

1) COM 呼び出しから Variant を受け取った後、Dispatch に変換する前に使用します。Variant.isNull()したがって、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 に答える