Автоматизация Word - SaveAs - PullRequest
       23

Автоматизация Word - SaveAs

3 голосов
/ 04 июня 2010

Я пытаюсь написать простую 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 ]

2 голосов
/ 07 июня 2010

Синтаксис 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();
0 голосов
/ 06 июня 2010

Думаю, я начну сначала, так как вы открыли награду.

Измените вашу переменную varFormat с wdFormatXMLDocument на целое число 12 (вероятно, как вы сделали переменную varCompability). wdFormatXMLDocument - это перечисление WdSaveFormat, появившееся в Word 2003. Нет необходимости отправлять L"name" - просто отправьте целое число 12.

Если это ранее сохраненные документы (т.е. не новые), сначала выполните преобразование, чтобы получить его в нужном формате (например, ActiveDocument.Convert)

0 голосов
/ 04 июня 2010

Измените вашу переменную varFormat с wdFormatXMLDocument на целое число 12 (вероятно, как вы сделали переменную varCompability). Кроме того, что такое 10 после "SaveAs2"?

...