我正在修改MFC应用程序,将DOCX文件转换为RTF,以便在自动Word 2003上使用。为此,我使用了Office2007兼容包安装的文本转换器"Wordcnvpxy.cnv"。我已经阅读了"外部文本文件转换器SDK"(此处提供),并浏览了提供的示例,以了解如何调用我所需要的ForeignToRtf32函数。所以,我有
-
函数签名:
typedef long (PASCAL *PFN_RTF)(long, long); short ForeignToRtf32(HANDLE ghszFile, Istorage* pstgForeign, HANDLE ghBuff, HANDLE ghszClass, HANDLE ghszSubset, PFN_RTF lpfnOut);
-
包含DOCX文件名称的Cstring变量(对应于RtfToForeign32的第一个参数)
有了这个,作为一个C++新手,我有几个问题:
- 我不知道如何从CString到HANDLE(我读了很多页都没有找到好的解决方案)。我不能使用"clr",所以运算符^对我来说不是一个选项,无论我尝试什么,返回值总是"-1"(意味着函数无法打开输入文件)
- 我只需要参数1(文件名)、3(包含RTF输出的缓冲区)和6(转换器使用的RTF块)。其他参数将为NULL。那么,我如何将句柄ghbuff传递的缓冲区保存到文件中呢
有关信息,对InitConverer32和UninitConverter的强制调用工作正常。
好吧,所以我终于解决了我的问题。总之,我的问题是:"如何在Word 2003自动化应用程序上处理DOCX文档",我发现了一个比使用Converter SDK更简单的解决方案。
为了获得成功的转换,我必须做的是(复制/粘贴我在MSDN中问的同一个问题):
- 检测我的文档是否是DOCX文档(扩展名不是相关,我需要检查文件签名)
- 获取对应于Word2007Converter的FileConverter对象(当然需要兼容包)
- 在"Documents.Open"方法
以下是代码的一些摘录:
OpenDoc( CString inFileName, BOOL tryAgain ) {
m_oDoc = NULL;
FileConverter fc = NULL;
// isDocxFile checks the file signature
BOOL isDocX = isDocxFile(inFileName);
FileConverters fcList = m_oWordApp.GetFileConverters();
if (fcList.GetCount() > 1) {
// Beginning the loop on "0" won't work. The fcList starts at 1.
for (long i=1; i < fcList.GetCount() + 1; i++) {
FileConverter fcTemp = fcList.Item(COleVariant((long) i));
if (fcTemp.GetClassName() == "Word12") {
fc = fcTemp;
}
}
}
if (isDocX) {
m_oDoc = m_oDocs.Open( COleVariant( inFileName ), //FileName
vFalse, //ConfirmConversions
vTrue, //ReadOnly
vFalse, //AddToRecentFiles
vOpt, //PasswordDocument
vOpt, //PasswordTemplate
vFalse, //Revert
vOpt, //WritePasswordDocument
vOpt, //WritePasswordTemplate
COleVariant(fc.GetOpenFormat()), //Format
vOpt, //Encoding
vOpt); //Visible
}
else
{
m_oDoc = m_oDocs.Open( COleVariant( inFileName ), //FileName
vFalse, //ConfirmConversions
vTrue, //ReadOnly
vFalse, //AddToRecentFiles
vOpt, //PasswordDocument
vOpt, //PasswordTemplate
vFalse, //Revert
vOpt, //WritePasswordDocument
vOpt, //WritePasswordTemplate
vOpt, //Format
vOpt, //Encoding
vOpt); //Visible
}
}
完成所有这些后,我的文档可以正确呈现,并在需要时保存为RTF