保存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支持。 |