Použití automatizace k přijetí předdefinované vlastnosti dokumentu

Překlady článku Překlady článku
ID článku: 179494 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Tento článek popisuje jak najít a vytisknout dokument předdefinované vlastnosti dokumentu aplikace Word pomocí verze 4.2 knihovny Microsoft Foundation Class (MFC) nainstalován Microsoft Visual C++ verze 5.0 a 6.0. Vlastnosti dokumentu vestavěné zahrnují název dokumentu, předmět, Autor, klíčová slova, komentáře, šablony, data, počet stránek, slov, znaků a mnoho vlastností.

Další informace

Kopírovat kód v tomto článku lze funkci zpráva obslužné rutiny události definované v souboru cpp MFC. Účel kód je však ilustrovat proces pomocí rozhraní IDispatch a funkce členů definovaných v knihovně typů MSWord. Primárním přínosem pochází z čtení a Principy kód v příkladu tak, aby upravit příkladu nebo napsat kód zcela zautomatizovat hledání a tisk seznamu vlastnosti vestavěné dokumentu.

Kroky vytvoření projektu

  1. V aplikaci Word vytvořit nový dokument s názvem Test.doc a uložte kořenového adresáře jednotky C.
  2. Postupujte podle kroků 1 až 12 v následujícím článku Microsoft Knowledge Base vytvořit ukázkový projekt, který používá rozhraní IDispatch a funkce členů definovaných v knihovně typů MSWord8.olb:
    178749Vytvoření projektu aplikace automatizace pomocí MFC a knihovny typů
  3. Přidejte následující řádek v horní části AutoProjectDlg.cpp:
          #include "MSWord8.h" // msword9.h for Word 2000, msword.h for Word 2002
    					
  4. Přidejte následující kód CAutoProjectDlg::OnRun() v souboru AutoProjectDlg.cpp.

    Ukázkový kód

          _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. Potřebujete upravit kód v CAutoProjectDlg::OnRun() označují správnou cestu pro dokument Test.doc. Odkazovaný dokument v následující řádek:
          lpDisp = docs.Open(COleVariant("C:\\Test.doc",VT_BSTR),
    					

Odkazy

Další informace o automatizaci systému Office aplikací klepněte v článku číslo článku databáze Microsoft Knowledge Base:
222101Jak najít a použití dokumentace Office objektového modelu

Vlastnosti

ID článku: 179494 - Poslední aktualizace: 12. února 2007 - Revize: 3.3
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Foundation Class Library 4.2 na těchto platformách
    • Microsoft Visual C++ 5.0 Standard Edition
    • Microsoft Visual C++ 6.0 Service Pack 5
    • Microsoft Word 97 Standard Edition
  • Microsoft Office XP Developer Edition
  • Microsoft Office 2000 Developer Edition
Klíčová slova: 
kbmt kbautomation kbfaq kbfaq kbhowto kbinterop KB179494 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:179494

Dejte nám zpětnou vazbu

 

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