jacob异常Dispatch not hooked to windows memory

2020-08-26 14:55:03 | 编辑

java jacob调用office编程出现异常:

com.jacob.com.ComFailException: Can’t map name to dispid: Open

这种异常是因为操作完成后,没有调用ComThread.Release()去释放jacob

java.lang.IllegalStateException: Dispatch not hooked to windows memory

这种异常有可能是多次调用了ComThread.Release();而引起的。

但我今天碰到这种异常,却不是这样,在初始化jacob所需的对象的时候,会做一个判断:

if (word == null) {
word = new ActiveXComponent(“Word.Application”);
word.setProperty(“Visible”, new Variant(false));
word.setProperty(“DisplayAlerts”, new Variant(false));
}
if (documents == null) {
documents = word.getProperty(“Documents”).toDispatch();
}

这里的word和documents是Dispatch类型。

然后每次操作完成后都会调用ComThread.Release()去释放,但释放后word和documents并不为null,所以每次使用jacob都只有第一次是正常的,后面就要报错,然后必须重启tomcat才行。

问题就出在初始化的判断上了,要这样写:

if (word == null||word.m_pDispatch0) {
word = new ActiveXComponent(“Word.Application”);
word.setProperty(“Visible”, new Variant(false));
word.setProperty(“DisplayAlerts”, new Variant(false));
}
if (documents == null||documents.m_pDispatch0) {
documents = word.getProperty(“Documents”).toDispatch();
}

这样可以正常初始化jacob,后面的操作也不会报异常了。

 

登录后即可回复 登录 | 注册
    
关注编程学问公众号