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,后面的操作也不会报异常了。
原文链接:https://blog.csdn.net/ooxxooxx123/article/details/84653770
相关推荐
本文主要介绍了三种方法,以及如何解决在使用Jacob时遇到的`ComFailException 8000FFFF`错误。 首先,我们来看三种调用OCX控件的方法: 1. **JNI (Java Native Interface)**:直接通过JNI调用OCX控件是最直接的...
DisplayID是VESA(Video Electronics Standards Association)推出的一种标准,用于定义显示设备配置信息的数据格式。这个标准的目的是简化并优化视频接口和图像信号的设置,使得显示设备能够实现即插即用的功能,...
COleVariant varFileName(_T("C:\\path\\to\\document.docx")); // 文件路径 wordApp.GetActiveObject("Word.Document", TRUE); // 如果已经打开则获取,否则创建新文档 wordApp.pDispatch->Invoke([=](DISPID ...
使用`COleDispatchDriver`的`InvokeHelper`函数,可以通过其Dispatch ID (DISPID)调用Word的COM接口方法,例如打开(`Open`)和保存(`SaveAs`)文档。 5. **创建新文档**: 可以通过调用Word的`Documents.Add`方法...
在VC++ 2003环境下,开发对Word 2000的接口操作是一项常见的任务,这通常涉及到Microsoft Office的自动化(Automation)技术。在这个特定的代码实例中,我们聚焦于如何使用C++来打开并操作包含表格的Word文档,特别...
- 在窗口的初始化函数(如`OnCreate`)中,使用`m_wordApp.CreateDispatch(_T("Word.Application"))`来创建并激活Word对象。 4. **动态生成表格**: - 首先,我们需要获取Word的`Documents`集合,然后使用`Add`...
例如,`dispid_Docs`代表`Application`对象的`Documents`属性,`dispid_DocsAdd`表示`Documents`集合的`Add`方法,`dispid_Sel`代表`Application`对象的`Selection`属性,`dispid_TypeText`和`dispid_TypePara`分别...
在进行办公自动化处理时,我们经常需要使用程序来控制 Word 文档的创建、编辑及保存等操作。本篇将详细介绍如何利用 VC++ 通过 COM 接口来实现对 Word 文档的操作,包括打开、编辑、保存以及另存为等功能。 #### 二...
### VC6.0中利用Word实现报表功能 在软件开发领域,特别是在企业级应用中,报表功能是非常重要的组成部分之一。它能够帮助用户更好地理解和分析数据,进而做出更准确的决策。Visual C++ 6.0(简称VC6.0)作为一款...
GetDlgItem(IDC_WEBBROWSER1)->Invoke DISPID_REFRESH, VT_EMPTY, NULL, (LPDISPATCH)&jsCode, NULL, NULL); } ``` 在HTML页面中,定义对应的`MapSetCenter`函数: ```javascript function MapSetCenter(lat, lng...
STDMETHODIMP CMyView::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr) { if (dispIdMember == ...
property has been name changed to aSeries, retaining its DispId to support existing compiled applications. 2. The following is handled automatically if you import the TeeChart classes. For ...
property has been name changed to aSeries, retaining its DispId to support existing compiled applications. 2. The following is handled automatically if you import the TeeChart classes. For ...
T("elementid1"), OnClick) DHTML_EVENT_ONMOUSEMOVE(_T("elementid2"), OnMouseMove) DHTML_EVENT_ELEMENT(DISPID_HTMLELEMENTEVENTS_ONMOUSEOVER, _T("elementid"), OnMouseOver) // id为elementid的...
[id(DSOF_DISPID_WORD_DocumentChange), helpstring("DSOF_DISPID_WORD_DocumentChange")] HRESULT WORD_DocumentChange(); [id(DSOF_DISPID_WORD_DocumentBeforePrint), helpstring("DSOF_DISPID_WORD_...
本项目"VC6.0编写的自定义WORD工具栏"就是这样一个示例,它展示了如何为Word添加自定义功能,例如增加自定义按钮,并处理这些按钮的点击事件。 COM是微软提出的一种二进制标准,它允许不同编程语言和不同操作系统...
// This source code is only intended as a supplement to the // Microsoft Foundation Classes Reference and related // electronic documentation provided with the library. // See these sources for ...
renamed to aSeries but retains its DispId to support existing, non-changed code and already compiled applications. When upgrading VC++ classes to the latest version it should suffice in all ...
它是一个指向`IDispatch`接口的指针,该接口提供了访问对象的属性和方法的途径,特别是对于那些在运行时类型信息(RTTI)不可用的环境。`LPDISPATCH`是`IDispatch*`的typedef,通常在自动化服务器和脚本环境中使用,...
50. **Dispid `<number>` already used by `<name>`** - **含义**: DISPID 标识号已被 `<name>` 使用。 - **解决办法**: 更改 DISPID 值或确保唯一性。 51. **Dispid clause only allowed in OLE automation ...