Word自动化 - SaveAs

时间:2010-06-04 03:14:34

标签: c++ com ms-word

我尝试编写一个简单的MFC - Word Automation每1分钟保存一次。 我按照这篇文章:http://www.codeproject.com/KB/office/MSOfficeAuto.aspx

这就是我想要实现的,我是COM的新手所以我觉得这里有问题: 我的VBA由Word 2010生成:

ActiveDocument.SaveAs2 FileName:="1.docx", FileFormat:=wdFormatXMLDocument _
    , LockComments:=False, Password:="", AddToRecentFiles:=True, _
    WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _
     SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _
    False, CompatibilityMode:=14

我在上面实现VBA代码的代码:

{
    COleVariant varName(L"b.docx");
    COleVariant varFormat(L"wdFormatXMLDocument");
    COleVariant varLockCmt((BYTE)0);
    COleVariant varPass(L"");
    COleVariant varReadOnly((BYTE)0);
    COleVariant varEmbedFont((BYTE)0);
    COleVariant varSaveNativePicFormat((BYTE)0);
    COleVariant varForms((BYTE)0);
    COleVariant varAOCE((BYTE)0);
    VARIANT x;
    x.vt = VT_I4;
    x.lVal = 14;
    COleVariant varCompability(&x);;

    VARIANT result;
    VariantInit(&result);
    _hr=OLEMethod(  DISPATCH_METHOD, &result, pDocApp, L"SaveAs2",10,
                    varName.Detach(),varFormat.Detach(),varLockCmt.Detach(),varPass.Detach(),varReadOnly.Detach(),
                    varEmbedFont.Detach(),varSaveNativePicFormat.Detach(),varForms.Detach(),varAOCE.Detach(),varCompability.Detach()
                 );
}

我没有收到任何错误,但它不起作用。

3 个答案:

答案 0 :(得分:2)

VBA语法使用命名参数,其中参数的顺序和计数无关紧要。但是,从C ++调用时,您需要按正确的顺序传递所需数量的参数。

SaveAs2定义为:

void SaveAs2(
    ref Object FileName,
    ref Object FileFormat,
    ref Object LockComments,
    ref Object Password,
    ref Object AddToRecentFiles,
    ref Object WritePassword,
    ref Object ReadOnlyRecommended,
    ref Object EmbedTrueTypeFonts,
    ref Object SaveNativePictureFormat,
    ref Object SaveFormsData,
    ref Object SaveAsAOCELetter,
    ref Object Encoding,
    ref Object InsertLineBreaks,
    ref Object AllowSubstitutions,
    ref Object LineEnding,
    ref Object AddBiDiMarks,
    ref Object CompatibilityMode
)

因此,它有17个参数,这意味着如果你要传递CompatibilityMode,你应该全部指定它们,在你的例子中指定为第10个参数(对应于SaveFormsData)。

如果您不需要所有参数,或仅用于测试,您可以尝试更简单的代码:

_hr = OLEMethod(DISPATCH_METHOD, &result, pDocApp, L"SaveAs2", 2, varName.Detach(), varFormat.Detach());

如果您需要其余参数,则需要将所有参数传递到您需要设置的参数。在这种情况下,您可以传递

COleVariant vtOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

表示您不想设置的参数。

修改 - 测试代码

这对我有用:

    CoInitialize(NULL);

    CLSID clsid;
    IDispatch *pWApp;
    HRESULT hr = CLSIDFromProgID(L"Word.Application", &clsid);
    hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pWApp);

    hr = OLEMethod(DISPATCH_PROPERTYPUT, NULL, pWApp, L"Visible", 1, COleVariant((long)1));

    VARIANT result;
    VariantInit(&result);
    hr = OLEMethod(DISPATCH_PROPERTYGET, &result, pWApp, L"Documents", 0);
    IDispatch *pDocs = result.pdispVal;

    VARIANT result2;
    VariantInit(&result2);
    hr = OLEMethod(DISPATCH_METHOD, &result2, pDocs, L"Open", 1, COleVariant(L"D:\\Archive\\t1.docx"));
    IDispatch *pDoc = result2.pdispVal;

    VARIANT result3;
    VariantInit(&result3);
    hr = OLEMethod(DISPATCH_METHOD, &result3, pDoc, L"SaveAs2", 1, COleVariant(L"D:\\Archive\\t2.docx"));

    CoUninitialize();

答案 1 :(得分:0)

将变量varFormatwdFormatXMLDocument更改为12的整数(可能就像您已完成varCompability变量一样)。此外,10之后的"SaveAs2"是什么?

答案 2 :(得分:0)

猜猜自从你打开奖金后我会重新开始。

将变量varFormat从wdFormatXMLDocument更改为12的整数(可能就像您已完成varCompability变量一样)。 wdFormatXMLDocumentWdSaveFormat的枚举,并在Word 2003中引入。无需发送L"name" - 只需发送12的整数。

如果这些是之前保存的文档(即非新文档),请先执行转换以使其格式正确(如ActiveDocument.Convert