Cómo utilizar automatización para recuperar propiedades de documento integrada

Seleccione idioma Seleccione idioma
Id. de artículo: 179494 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Se explica cómo utilizar la versión 4.2 de la biblioteca de Microsoft Foundation Class (MFC) instalado con las versiones 5.0 y 6.0 de Microsoft Visual C++ para buscar e imprimir las propiedades integradas del documento de un documento de Microsoft Word. Las propiedades de documento integradas incluyen el título del documento, asunto, autor, palabras clave, comentarios, plantilla, las fechas, el número de páginas, palabras, caracteres y muchas otras propiedades.

Más información

Puede copiar el código en este artículo a la función de controlador de mensaje de un evento definido en un archivo .cpp MFC. Sin embargo, el propósito del código es ilustrar el proceso del uso de las interfaces IDispatch y funciones miembro definidas en la biblioteca de tipo de MSWord. La principal ventaja proviene de leer y entender el código del ejemplo poder modificar el ejemplo o escribir código desde cero para automatizar la búsqueda y imprimir una lista de las propiedades de documento integradas.

Pasos para crear el proyecto

  1. En Microsoft Word, crear un nuevo documento con el nombre Test.doc y guárdelo el directorio raíz de la unidad C.
  2. Siga los pasos 1 al 12 en el siguiente Microsoft Knowledge Base artículo Crear un proyecto de ejemplo que utiliza las interfaces IDispatch y funciones miembro definidas en la biblioteca de tipo MSWord8.olb:
    178749Cómo crear un proyecto de automatización mediante MFC y una biblioteca de tipos
  3. En la parte superior de la AutoProjectDlg.cpp, agregue la siguiente línea:
          #include "MSWord8.h" // msword9.h for Word 2000, msword.h for Word 2002
    					
  4. Agregue el código siguiente a CAutoProjectDlg:: OnRun () en el archivo AutoProjectDlg.cpp.

    Código de ejemplo

          _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. Deberá modificar el código de CAutoProjectDlg:: OnRun () para indicar la ruta correcta para el documento Test.doc. El documento se hace referencia en la siguiente línea:
          lpDisp = docs.Open(COleVariant("C:\\Test.doc",VT_BSTR),
    					

Referencias

Para obtener información adicional acerca de la automatización de aplicaciones Office, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
222101Cómo buscar y utilizar la documentación de modelo de objetos de Office

Propiedades

Id. de artículo: 179494 - Última revisión: lunes, 12 de febrero de 2007 - Versión: 3.3
La información de este artículo se refiere a:
  • Microsoft Foundation Class Library 4.2 sobre las siguientes plataformas
    • Microsoft Visual C++ 5.0 Standard
    • Microsoft Visual C++ 6.0 Service Pack 5
    • Microsoft Word 97 Standard Edition
  • Microsoft Office XP Developer Edition
  • Microsoft Office 2000 Developer Edition
Palabras clave: 
kbmt kbautomation kbfaq kbfaq kbhowto kbinterop KB179494 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 179494

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com