如何在线程中读取DOC文件内容?

Stand_Alone_Complex 2014-01-14 10:15:34
创建了一个对话框的MFC工程
//全局变量
Documents docs;
Selection selection;
_Document doc;
_Application wordApp;
//***************************

CString *pstr,path,str;
int i;

path="C:\\Documents and Settings\\Administrator\\桌面\\新建文件夹\\1.doc";//文件目录
LPDISPATCH pd;
COleVariant vTrue((short)TRUE),vFalse((short)FALSE),vOpt((long)DISP_E_PARAMNOTFOUND,VT_ERROR),vZ((short)0);
if(AfxOleInit()
&& wordApp.CreateDispatch("Word.Application",NULL))
{

wordApp.SetVisible(1);
docs.AttachDispatch(wordApp.GetDocuments());
AfxMessageBox("here");
pd=docs.Open(COleVariant(path),vFalse,vTrue,vFalse,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vZ,vOpt,vOpt);

doc.AttachDispatch(pd);
//AfxMessageBox("here");
selection=wordApp.GetSelection();
selection.GetSections();
selection.WholeStory();
content=selection.GetText();
AfxMessageBox(content);
selection.ReleaseDispatch();

doc.Close(vOpt,vOpt,vOpt);
doc.ReleaseDispatch();
wordApp.Quit(vFalse,vOpt,vOpt);
wordApp.ReleaseDispatch();
}
//以上代码在主程序中运行正常,读出了word文档的内容
//但是放在由AfxBeginThread开启的线程中就总在docs.Open这一步失败
//显示:unhandled exception in WordReader.exe (KERNEL32.dll) 0xE06D7363 Micsoft C++ Exception
//这是为何???
...全文
153 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 9 楼 u013472580 的回复:
[quote=引用 8 楼 jason_wentzel 的回复:] 把你线程中代码贴上来,还是那句话,线程中要初始化COM环境
UINT CtestDlg::proc(LPVOID param) { CtestDlg *pd=(CtestDlg*)param; LPDISPATCH pds; CString AppName("Word.Application"),path("C:\\1.doc"),content,str; COleVariant vTrue((short)TRUE),vFalse((short)FALSE),vOpt((long)DISP_E_PARAMNOTFOUND,VT_ERROR),vZ((short)0); CComVariant tpl(_T("C:\\1.doc")), NewTemplate(false), DocType(0), Visble; // BuildJob test.doc if(CoInitialize(NULL) == S_OK && pd->wordApp.CreateDispatch(AppName,NULL)) { //pd->wordApp.put_Visible(1); pd->docs.AttachDispatch(pd->wordApp.get_Documents()); pd->doc = pd->docs.Add(&tpl,&NewTemplate,&DocType,&Visble); pd->range=pd->doc.Range(vOpt,vOpt); AfxMessageBox(pd->range.get_Text()); pd->range.ReleaseDispatch(); AfxMessageBox(str); // //AfxMessageBox(str); pd->doc.Close(vOpt,vOpt,vOpt); pd->doc.ReleaseDispatch(); //pd->docs.Close(vOpt,vOpt,vOpt); pd->docs.ReleaseDispatch(); pd->wordApp.Quit(vFalse,vOpt,vOpt); pd->wordApp.ReleaseDispatch(); AfxMessageBox(str); CoUninitialize(); /*pd->selection=pd->wordApp.get_Selection(); pd->selection.get_Sections(); pd->selection.WholeStory(); content=pd->selection.get_Text(); AfxMessageBox(content); pd->selection.ReleaseDispatch(); pd->doc.Close(vOpt,vOpt,vOpt); pd->doc.ReleaseDispatch(); pd->wordApp.Quit(vFalse,vOpt,vOpt); pd->wordApp.ReleaseDispatch();*/ } return 0; }[/quote] 如果没有发错版本的话,这段代码在vs2008中测试成功了,但是无法稳定地隐蔽在后台运行。所以现在已经放弃了这种方法。我想尝试引用java的代码,现在还没有成功。
  • 打赏
  • 举报
回复
引用 8 楼 jason_wentzel 的回复:
把你线程中代码贴上来,还是那句话,线程中要初始化COM环境
UINT CtestDlg::proc(LPVOID param) { CtestDlg *pd=(CtestDlg*)param; LPDISPATCH pds; CString AppName("Word.Application"),path("C:\\1.doc"),content,str; COleVariant vTrue((short)TRUE),vFalse((short)FALSE),vOpt((long)DISP_E_PARAMNOTFOUND,VT_ERROR),vZ((short)0); CComVariant tpl(_T("C:\\1.doc")), NewTemplate(false), DocType(0), Visble; // BuildJob test.doc if(CoInitialize(NULL) == S_OK && pd->wordApp.CreateDispatch(AppName,NULL)) { //pd->wordApp.put_Visible(1); pd->docs.AttachDispatch(pd->wordApp.get_Documents()); pd->doc = pd->docs.Add(&tpl,&NewTemplate,&DocType,&Visble); pd->range=pd->doc.Range(vOpt,vOpt); AfxMessageBox(pd->range.get_Text()); pd->range.ReleaseDispatch(); AfxMessageBox(str); // //AfxMessageBox(str); pd->doc.Close(vOpt,vOpt,vOpt); pd->doc.ReleaseDispatch(); //pd->docs.Close(vOpt,vOpt,vOpt); pd->docs.ReleaseDispatch(); pd->wordApp.Quit(vFalse,vOpt,vOpt); pd->wordApp.ReleaseDispatch(); AfxMessageBox(str); CoUninitialize(); /*pd->selection=pd->wordApp.get_Selection(); pd->selection.get_Sections(); pd->selection.WholeStory(); content=pd->selection.get_Text(); AfxMessageBox(content); pd->selection.ReleaseDispatch(); pd->doc.Close(vOpt,vOpt,vOpt); pd->doc.ReleaseDispatch(); pd->wordApp.Quit(vFalse,vOpt,vOpt); pd->wordApp.ReleaseDispatch();*/ } return 0; }
孤客天涯 2014-01-20
  • 打赏
  • 举报
回复
把你线程中代码贴上来,还是那句话,线程中要初始化COM环境
  • 打赏
  • 举报
回复
引用 1 楼 jason_wentzel 的回复:
线程中COM环境初始化了不?
错误发生在pd=docs.Open(COleVariant(path),vFalse,vTrue,vFalse,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vZ,vOpt,vOpt);
  • 打赏
  • 举报
回复
引用 4 楼 zhaowech 的回复:
异常代码会提示出错的原因,是可分析的, 还有,通过对调用堆栈的调试一般都可以找到出错的点。 个人猜测是参数传递给线程失败,你看看变量是否正确,如果没问题,把异常的具体信息贴出来
java的poi可以读取word文档内容,但是只限在java环境下,我这几天尝试了JNI,用c++来调用java代码的方法,但是编译时出现错误,错误指向jsize GetArrayLength(jarray array) 这个地方。
  • 打赏
  • 举报
回复
引用 2 楼 jason_wentzel 的回复:
CoInitialize,CoUninitialize?
在vc60.中在打开word文件的时候就出错(用release编译),尝试很多方法都不行 在vs2008中好像就可以,也不会出错,但是限制很多,例如已经打开了word文档,在后台读取其他的word文档就会弹出保存模板的窗口
孤影品茗 2014-01-17
  • 打赏
  • 举报
回复
异常代码会提示出错的原因,是可分析的, 还有,通过对调用堆栈的调试一般都可以找到出错的点。 个人猜测是参数传递给线程失败,你看看变量是否正确,如果没问题,把异常的具体信息贴出来
孤客天涯 2014-01-16
  • 打赏
  • 举报
回复
CoInitialize,CoUninitialize?
孤客天涯 2014-01-16
  • 打赏
  • 举报
回复
线程中COM环境初始化了不?
华美乐章 2014-01-16
  • 打赏
  • 举报
回复
你必须在线程中重新初始化COM库,调用CoInitialize(NULL) 在写你的业务代码

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧