2010-06-04 6 views
3

J'essaie d'écrire une simple automation MFC-Word pour économiser toutes les minutes. Je suivre cet article: http://www.codeproject.com/KB/office/MSOfficeAuto.aspxWord automation - SaveAs

Et c'est ce que Im essayant de mettre en œuvre, je suis nouveau COM Je pense donc il ici est le problème: mon VBA est généré par 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 

Et mon code pour implémenter le code VBA ci-dessus:

{ 
    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() 
       ); 
} 

Je ne reçois aucune erreur de celui-ci, mais cela ne fonctionne pas.

Répondre

2

La syntaxe VBA utilise des paramètres nommés où l'ordre et le nombre des paramètres n'a pas d'importance. Cependant, lorsque vous appelez depuis C++, vous devez passer le nombre requis de paramètres dans le bon ordre.

SaveAs2 est défini comme:

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 
) 

Ainsi, il a 17 paramètres qui signifie que vous devez tous les spécifier si vous allez passer CompatibilityMode, qui a été spécifié comme paramètre 10 dans votre exemple (qui corressponds à SaveFormsData).

Si vous n'avez pas besoin de tous les paramètres, ou juste pour le test, vous pouvez essayer un code plus simple:

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

Si vous avez besoin du reste des paramètres, vous devez passer tous les paramètres jusqu'à le paramètre que vous devez définir. Dans ce cas, vous pouvez transmettre

COleVariant vtOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); 

pour les paramètres que vous ne souhaitez pas définir.

Edition - Test Code

Cela fonctionne pour moi:

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

Cela ne fonctionne pas, la chose la plus importante est "SaveAs2" ou "SaveAs" retour comme nom inconnu – nXqd

+0

Cela signifie que vous envoyez la mauvaise interface. Êtes-vous sûr que pDocApp est un document? Je mettrai à jour ma réponse avec un code de test. – Recep

0

Changer votre variable varFormat de wdFormatXMLDocument à un nombre entier de 12 (probablement comme vous avez fait la variable varCompability). Aussi, quel est le 10 pour après "SaveAs2"?

+0

10 arguments que je veux dire :) – nXqd

+0

@nXqd: donc fait le travail de changement pour vous? –

+0

Non ce n'est pas :). C'est assez étrange, ils ne fournissent pas de documents sur ce que L "nom" que je devrais envoyer. – nXqd

0

Devinez Je vais recommencer depuis que vous avez ouvert la prime.

Modifiez votre variable varFormat de wdFormatXMLDocument à un entier de 12 (probablement comme vous avez fait la variable varCompability). wdFormatXMLDocument est une énumération de WdSaveFormat et a été introduit dans Word 2003. Il n'est pas nécessaire d'envoyer un L"name" - il suffit d'envoyer l'entier de 12.

Si ceux-ci sont préalablement enregistrés les documents (non nouveaux), effectuer une première conversion pour obtenir au format (comme ActiveDocument.Convert)

+0

J'ai changé mais ça ne marche pas :) – nXqd

+0

Quelle version de Word référencez-vous? Je sais que vous utilisez 'SaveAs2', mais est-ce celui qui est automatisé? –

Questions connexes