Office Word-如何在C++中调用ForeignToRtf32
Office Word - How to call ForeignToRtf32 in C++?
我正在修改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
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- std::cout.imbue()多重调用
- 函数何时会在c++中包含stack_Unwind_Resume调用