科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件在MFC应用程序中动态嵌入Word文档

在MFC应用程序中动态嵌入Word文档

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文通过对自动化等COM技术的应用介绍了一种在MFC应用程序中动态嵌入Microsoft Word文档的简单方法

作者:中国电子科技集团公司第二十二研 来源:天极网 2007年10月19日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
 保存Word文档

  虽然已经将Word环境嵌入到应用程序,Word文档也已经打开并显示,但如果使用向导生成的“保存”功能去保存当前打开的Word文档却只能保存一个空的文档。这是因为当前嵌入Word后的程序界面中的“文件”菜单是属于包容器程序的,在没有和Word建立关联前是无法执行文档保存功能的。在其命令响应函数中添加下述代码以完成对文档的保存:

// 显示打开文件对话框
CFileDialog fileDlg(FALSE, "*.doc", "*.doc", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Word文件(*.doc)|*.doc||", NULL);
if (fileDlg.DoModal() != IDOK)
 return;
CString sPath = fileDlg.GetPathName();
char cPath[256];
memset(cPath, 0, sizeof(cPath));
memcpy(cPath, sPath, sPath.GetLength());
WCHAR wPath[256];
memset(wPath, 0, sizeof(wPath));
MultiByteToWideChar(CP_ACP, MB_COMPOSITE, cPath, sPath.GetLength(), wPath, sizeof(wPath));
IDispatch *pOle = m_pSelection->GetIDispatch();
if (!pOle )
 return; // No ole document
IPersistFile *pPFile = NULL;
pOle->QueryInterface(IID_IPersistFile, (void**)&pPFile);
if (!pPFile)
{
 // 不支持IPersistFile接口
 if (pOle)
  pOle->Release();
 if (pPFile)
  pPFile->Release();
}
else
pPFile->Save(wPath, FALSE);

  这段代码的核心思想是通过使用IPersistFile接口的Save()方法完成对当前文档的保存。由于该方法第一个参数是一个LPOLESTR型变量,查看其宏定义可以知道该变量是一个指向宽字符缓冲区的指针,由CFileDialog类成员函数GetPathName()所返回的CString型文档路径不能直接使用,必须通过MultiByteToWideChar()函数将其内容转换到一个WCHAR型数组中。其第一个参数由CP_ACP指定为使用ANSI编码包,第二个参数设置为MB_COMPOSITE以指出一直使用复合字符。后面四个变量分别为源缓冲区的地址、大小和目的缓冲区的地址和大小。

  小结

  编译执行程序,当程序打开Word文档时将动态启动Word自动化服务,这时鼠标会处于等待状态,当鼠标恢复正常状态时,Word已经被嵌入到了程序中来,工具条和菜单上增添有许多属于Word的工具条和菜单,可以通过它们对Word文档提供完善的支持和服务。本程序在Windows 2000 Professional 下由Microsoft Visual C++ 6.0编译通过。程序运行需要有Microsoft Word 97 或 Word 2000支持。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章