Utilizzo di automazione per recuperare proprietà di documento predefinito

Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell’utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell’utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.

Clicca qui per visualizzare la versione originale in inglese dell’articolo: 179494
Questo articolo è stato archiviato. L’articolo, quindi, viene offerto “così come è” e non verrà più aggiornato.
Sommario
In questo articolo viene illustrato come utilizzare la versione 4.2 della libreria MFC (Microsoft Foundation Class) installata con Microsoft Visual c ++ versioni 5.0 e 6.0 per trovare e stampare proprietà predefinite del documento di un documento di Microsoft Word. Le proprietà di documento predefinite includono il titolo del documento, oggetto, autore, parole chiave, commenti, modello, le date, numero di pagine, parole, caratteri e molte altre proprietà.
Informazioni
È possibile copiare il codice in questo articolo alla funzione di gestore del messaggio di un evento definito in un file cpp MFC. Tuttavia, lo scopo del codice è per illustrare il processo dell'utilizzo di interfacce IDispatch e le funzioni membro definite nella libreria dei tipi MSWord. Il vantaggio principale proviene da leggere e comprendere il codice di esempio in modo da modificare nell'esempio o scrivere codice da zero per automatizzare la ricerca e la stampa di un elenco delle proprietà incorporate del documento.

Procedura per creare il progetto

  1. In Microsoft Word, creare un nuovo documento test.doc e salvarlo nella directory principale dell'unità c.
  2. Eseguire i passaggi da 1 a 12 del seguente articolo della Microsoft Knowledge Base per creare un progetto di esempio che utilizza le interfacce IDispatch e le funzioni membro definite nella libreria dei tipi con MSWord8.olb:
    178749Creazione di un progetto di automazione tramite MFC e una libreria dei tipi
  3. All'inizio di AutoProjectDlg.cpp il, aggiungere la seguente riga:
          #include "MSWord8.h" // msword9.h for Word 2000, msword.h for Word 2002					
  4. Aggiungere il codice riportato di seguito a CAutoProjectDlg::OnRun() nel file AutoProjectDlg.cpp.

    Codice di esempio

          _Application objWordApp;      _Document objDoc;      LPDISPATCH lpDisp;      Range objRange;      // Common OLE variants that are easy to use for calling arguments.      COleVariant covTrue((short)TRUE),                  covFalse((short)FALSE),                  covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);      objWordApp.CreateDispatch("Word.Application");      objWordApp.SetVisible(TRUE);      Documents docs(objWordApp.GetDocuments());      lpDisp = docs.Open(COleVariant("C:\\Test.doc",VT_BSTR),                                          covFalse,    // Confirm.                                                       // Conversion.                                          covFalse,    // ReadOnly.                                          covFalse,    // AddToRecentFiles.                                          covOptional, // NULL,                                                       // PasswordDocument.                                          covOptional, // PasswordTemplate.                                          covFalse,    // Revert.                                          covOptional, // Write-                                                       // PasswordDocument.                                          covOptional, // Write-                                                       // PasswordTemplate.                                          covOptional  // Format. //Last parameter for Word 97                                             covOptional, // Encoding // Word 2000/2002 from here on                                             covTrue,     // Visible                                             covOptional, // OpenConflictDocument                                             covOptional, // OpenAndRepair                                             (long)0,     // DocumentDirection                                                           //wdDocumentDirection LeftToRight                                             covOptional  // NoEncodingDialog                                          );       objDoc.AttachDispatch(lpDisp);       lpDisp = objDoc.GetContent();       objRange.AttachDispatch(lpDisp);       // Move the insertion point to the beginning of the document.       objRange.Collapse(COleVariant((long)1));  //0 = wdCollapseEnd.       objRange.InsertAfter("Here are the BuiltInDocumentProperties!!");       objRange.InsertParagraphAfter(); // Write them one-by-one in a loop.       lpDisp = objDoc.GetBuiltInDocumentProperties();       COleDispatchDriver rootDisp[64];  // Temporary object array.       int curRootIndex = 0;             // Index into rootDisp[] array.       DISPID dispID;                    // Temporary dispid for use in                                         // OleDispatchDriver::                                         // InvokeHelper().       DISPID dispID2;                   // Dispid for 'Value'.       unsigned short *ucPtr;            // Temporary name holder for                                         // IDispatch::GetIDsOfNames().       VARIANT vtResult;                 // Holds results from                                         // OleDispatchDriver::                                         // InvokeHelper().       VARIANT vtResult2;                // Holds result for 'Type'.       BYTE *parmStr;                    // Holds parameter descriptions                                         // for COleDispatchDriver::                                         // InvokeHelper().       rootDisp[0].AttachDispatch(lpDisp);  // LPDISPATCH returned from                                         // GetBuiltInDocumentProperties.       VARIANT i;                        // integer;       VARIANT count;                    // integer;       char buf[512];                    // General purpose message buffer.       char buf2[512];       ucPtr = L"Count";                 // Collections have a Count                                         // member.       try       {        rootDisp[curRootIndex].m_lpDispatch->GetIDsOfNames(                                                IID_NULL,                                                &ucPtr,                                                1,                                                LOCALE_USER_DEFAULT,                                                &dispID);        rootDisp[curRootIndex].InvokeHelper(dispID,                                           DISPATCH_METHOD |                                           DISPATCH_PROPERTYGET,                                           VT_VARIANT,                                           (void *)&vtResult,                                           NULL);        count = vtResult;  // Require a separate variable for loop limiter.        // For i = 1 to count,        // get the Item, Name & Value members of the collection.        i.vt = VT_I4;        for(i.lVal=1; i.lVal<=count.lVal; i.lVal++)        {         ucPtr = L"Item";  // Collection has an Item member.         rootDisp[curRootIndex].m_lpDispatch->GetIDsOfNames(                                                IID_NULL,                                                &ucPtr,                                                1,                                                LOCALE_USER_DEFAULT,                                                &dispID);         parmStr = (BYTE *)( VTS_VARIANT );         rootDisp[curRootIndex].InvokeHelper(dispID,                                            DISPATCH_METHOD |                                            DISPATCH_PROPERTYGET,                                            VT_VARIANT,                                            (void *)&vtResult,                                            parmStr,                                            &COleVariant(i));         // Move to the next element of the array.         // Get the Name member for the Item.         rootDisp[++curRootIndex].AttachDispatch(vtResult.pdispVal);         ucPtr = L"Name";  // Collection has a Name member         rootDisp[curRootIndex].m_lpDispatch->GetIDsOfNames(                                                IID_NULL,                                                &ucPtr,                                                1,                                                LOCALE_USER_DEFAULT,                                                &dispID);         rootDisp[curRootIndex].InvokeHelper(dispID,                                            DISPATCH_METHOD |                                            DISPATCH_PROPERTYGET,                                            VT_VARIANT,                                            (void *)&vtResult,                                            NULL);          ucPtr = L"Value";  // Collection has a Value member.          rootDisp[curRootIndex].m_lpDispatch->GetIDsOfNames(                                            IID_NULL,                                            &ucPtr,                                            1,                                            LOCALE_USER_DEFAULT,                                            &dispID2);          rootDisp[curRootIndex].InvokeHelper(dispID2,                                            DISPATCH_METHOD |                                            DISPATCH_PROPERTYGET,                                            VT_VARIANT,                                            (void *)&vtResult2,                                            NULL);       Continue: // Come back here from Catch(COleDispatchException).         rootDisp[curRootIndex--].ReleaseDispatch();         // Initialize buf2 with representation of the value.         switch(vtResult2.vt) // Type of property.         {          case VT_BSTR:            sprintf(buf2, "%s", (CString)vtResult2.bstrVal);            break;          case VT_DATE:          {            COleDateTime codt(vtResult2.date);            sprintf(buf2, "Time = %d:%02d, Date = %d/%d/%d",              codt.GetHour(), codt.GetMinute(),              codt.GetMonth(), codt.GetDay(), codt.GetYear()               );          }            break;          case VT_I4:            sprintf(buf2, "%ld", vtResult2.lVal);            break;          default:            sprintf(buf2, "not VT_BSTR, VT_DATE, or VT_I4");         }  // End of Switch.         sprintf(buf, "Item(%d).Name = %s, .Type = %d, .Value = %s\n",                i.lVal, CString(vtResult.bstrVal), vtResult2.vt, buf2);         objRange.Collapse(COleVariant((long)0));  // Move insertion point                                                   // to end of the range.         objRange.InsertAfter(CString(buf));  // Insert after the insertion                                              // point.        }  ////////////////// End of For loop. ///////////////////////         objRange.InsertParagraphAfter(); // Spacing.        objRange.InsertAfter("");        objRange.InsertParagraphAfter(); // Spacing.        // Release IDispatch pointers on local objects.        if(vtResult.vt == VT_DISPATCH) vtResult.pdispVal->Release();        if(count.vt == VT_DISPATCH) count.pdispVal->Release();        rootDisp[0].ReleaseDispatch();        AfxMessageBox("All done, waiting...");        objDoc.SetSaved(TRUE);  // Hides the "Save your changes..." dialog.        AfxMessageBox("Word will close now. Goodbye");        objWordApp.Quit(covFalse, covFalse, covFalse);       }  // End try.       catch(COleException *e)       {        sprintf(buf, "COleException. SCODE: %08lx.", (long)e->m_sc);        ::MessageBox(NULL, buf, "COleException", MB_SETFOREGROUND | MB_OK);       }       catch(COleDispatchException *e)       {         if(vtResult2.vt ==VT_ERROR)         {           AfxMessageBox("Discarding vtResult2.VT_ERROR");         }         vtResult2.vt = VT_BSTR;         vtResult2.bstrVal = L"Value not available";         goto Continue;       }       catch(...)       {        MessageBox( "General Exception caught.", "Catch-All",        MB_SETFOREGROUND | MB_OK);       }       //////////////////// For information only. /////////////////////        //          Do not uncomment the following code snippet.          //        //  You can copy it and use it in lieu of the previous code when  //        //             you need to see just one property.                 //        /***************** Code to get a single property. *****************       // Works for one property.       COleDispatchDriver myDocumentProperties(lpDisp);       COleVariant result;       // Get myDocumentProperties.Item(1).       // Item(n) where n = property index       // value in properties collection.       UCHAR *parmStr = (BYTE *)( VTS_VARIANT );       myDocumentProperties.InvokeHelper(0, DISPATCH_METHOD |                                         DISPATCH_PROPERTYGET,                                         VT_VARIANT,                                         (void *)&result,                                         parmStr,                                         &COleVariant((long)1));       COleDispatchDriver myDocumentProperty(result.pdispVal);       // Get Name of this document property.       myDocumentProperty.InvokeHelper(3, DISPATCH_METHOD |                                          DISPATCH_PROPERTYGET,                                          VT_VARIANT,                                          (void *)&result,                                          NULL);       AfxMessageBox(CString("Item(1).Name =") + CString(result.bstrVal));       // Release this document property.       myDocumentProperty.ReleaseDispatch();       // Release the document properties collection.       myDocumentProperties.ReleaseDispatch();       //*************** End of code for single property. ****************/ 					
  5. Sarà necessario modificare il codice in CAutoProjectDlg:: OnRun () per indicare il percorso corretto per il documento test.doc. Il documento fa riferimento la riga seguente:
          lpDisp = docs.Open(COleVariant("C:\\Test.doc",VT_BSTR),					
Riferimenti
Per ulteriori informazioni sull'automazione delle applicazioni di Office, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito:
222101Trovare e utilizzare la documentazione del modello oggetti di Office
parola 8.0 word8 word97 ole

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 179494 - Ultima revisione: 12/05/2015 08:18:06 - Revisione: 3.3

Microsoft Foundation Class Library 4.2, Microsoft Office XP Developer Edition, Microsoft Office 2000 Developer Edition

  • kbnosurvey kbarchive kbmt kbautomation kbfaq kbfaq kbhowto kbinterop KB179494 KbMtit
Feedback