Você está offline; aguardando reconexão

Como usar a automação para recuperar propriedades internas do documento

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 179494
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sumário
Este artigo descreve como usar a versão 4.2 da biblioteca Microsoft Foundation Class (MFC) instalada com o Microsoft Visual C++ versões 5.0 e 6.0 para localizar e imprimir propriedades internas do documento de um documento do Microsoft Word. As propriedades de documento internas incluem título do documento, assunto, autor, palavras-chave, comentários, modelo, datas, número de páginas, palavras, caracteres e muitas outras propriedades.
Mais Informações
Você pode copiar o código neste artigo para a função de manipulador de mensagem de um evento definido em um arquivo de .cpp MFC. No entanto, a finalidade do código é ilustrar o processo de usar as interfaces de IDispatch e funções de membro definidas na biblioteca de tipos MSWord. A principal vantagem é proveniente de leitura e noções básicas sobre o código de exemplo para que você possa modificar o exemplo a ou escrever código do zero para automatizar a localizar e imprimir uma lista de propriedades internas do documento.

Passos para criar o projeto

  1. No Microsoft Word, criar um novo documento chamado Test.doc e, em seguida, salve-o no diretório raiz da unidade C.
  2. Siga as etapas 1 a 12 o seguinte artigo da base dados de Conhecimento Microsoft para criar um projeto de exemplo que usa o IDispatch interfaces e funções de membro definidas na biblioteca de tipos MSWord8.olb:
    178749Como criar um projeto de automação com MFC e uma biblioteca de tipos
  3. Na parte superior da AutoProjectDlg.cpp, adicione a seguinte linha:
          #include "MSWord8.h" // msword9.h for Word 2000, msword.h for Word 2002					
  4. Adicione o seguinte código para CAutoProjectDlg::OnRun() no arquivo AutoProjectDlg.cpp.

    Código de exemplo

          _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. Talvez você precise modificar o código no CAutoProjectDlg::OnRun() para indicar o caminho correto para o documento Test.doc. O documento é referenciado na seguinte linha:
          lpDisp = docs.Open(COleVariant("C:\\Test.doc",VT_BSTR),					
Referências
Para obter informações adicionais sobre os aplicativos de automação do Office, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
222101Como localizar e usar a documentação do modelo de objeto do Office
Word 8.0 word8 word97 ole

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 179494 - Última Revisão: 12/05/2015 08:18:07 - Revisão: 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 KbMtpt
Comentários