刚开始使用jacob,之前遇到word进程挂起的问题,按照网上的办法修改后,确实也解决了问题。但是最近生产环境又冒出这个问题,很让人疑惑。请各位帮忙看下,小弟先道声多谢了!
com.jacob.com.ComFailException: Can't map name to dispid: Quit
at com.jacob.com.Dispatch.invokev(Native Method)
at com.jacob.com.Dispatch.invokev(Dispatch.java:858)
at com.jacob.com.Dispatch.callN(Dispatch.java:455)
at com.jacob.activeX.ActiveXComponent.invoke(ActiveXComponent.java:576)
at com.util.WordManager.close(WordManager.java:698)
at com.servlet.account.PersonalOpenDocServlet.perform(PersonalOpenDocServlet.java:272)
at com.servlet.BaseServlet.defaultProc(BaseServlet.java:126)
at com.servlet.BaseServlet.doPost(BaseServlet.java:75)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Unknown Source)代码:
 /**
 * 使用jacob操作word文档
 */
public class WordManager {
private static Logger logger = Logger.getLogger(WordManager.class);

//word应用程序对象
private ActiveXComponent app = null;
//word文档集合
private Dispatch documents=null;
//word文档
private Dispatch doc=null;
//退出时是否保存,缺省为保存
private boolean saveOnExit = false;
// 选定的范围或插入点
    private Dispatch selection=null; /**
 * @param visible为true表示word应用程序可见
 */
public WordManager(boolean visible){
//初始化com的线程      
ComThread.InitSTA(); 

if(app == null){
//word运行程序对象 
app = new ActiveXComponent("Word.Application");

//文档对象   
//Dispatch wordObject = (Dispatch) app.getObject();   
//设置属性  Variant(true)表示word应用程序可见
//Dispatch.put((Dispatch)wordObject,"Visible", new Variant(visible)); 
app.setProperty("Visible", new Variant(visible));
}
if(documents == null){
documents = app.getProperty("Documents").toDispatch();
}
}
     public void close() {
        closeDocument();
/*        if (app != null) {
            Dispatch.call(app, "Quit");
            app = null;
        }
*/
        app.invoke("Quit", new Variant[]{});        //关闭com的线程      
        ComThread.Release();
  //      System.gc();
        selection = null;
        documents = null;
    }

解决方案 »

  1.   

    生产环境服务器上装的word和你开发的机器一样吗?
      

  2.   

    都是word2003.开发环境的操作系统是XP,生产环境的是server2003。还有一个灾备环境,是colone的生产环境。奇怪就奇怪在开发环境和灾备环境都没有这个问题。查了2天了,一直查不出有什么问题。