jacob常用异常处理

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_pDispatch==0) {
    word = new ActiveXComponent("Word.Application");
    word.setProperty("Visible", new Variant(false));
    word.setProperty("DisplayAlerts", new Variant(false));
   }
   if (documents == null||documents.m_pDispatch==0) {
    documents = word.getProperty("Documents").toDispatch();
   }

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

猜你喜欢

转载自jayyanzhang2010.iteye.com/blog/2117448