Office Word-如何在C++中调用ForeignToRtf32

Office Word - How to call ForeignToRtf32 in C++?

本文关键字:调用 ForeignToRtf32 C++ Word- Office      更新时间:2023-10-16

我正在修改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++新手,我有几个问题:

  • 我不知道如何从CStringHANDLE(我读了很多页都没有找到好的解决方案)。我不能使用"clr",所以运算符^对我来说不是一个选项,无论我尝试什么,返回值总是"-1"(意味着函数无法打开输入文件)
  • 我只需要参数1(文件名)、3(包含RTF输出的缓冲区)和6(转换器使用的RTF块)。其他参数将为NULL。那么,我如何将句柄ghbuff传递的缓冲区保存到文件中呢

有关信息,对InitConverer32UninitConverter的强制调用工作正常。

好吧,所以我终于解决了我的问题。总之,我的问题是:"如何在Word 2003自动化应用程序上处理DOCX文档",我发现了一个比使用Converter SDK更简单的解决方案。

为了获得成功的转换,我必须做的是(复制/粘贴我在MSDN中问的同一个问题):

  1. 检测我的文档是否是DOCX文档(扩展名不是相关,我需要检查文件签名)
  2. 获取对应于Word2007Converter的FileConverter对象(当然需要兼容包)
  3. 在"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