Összefoglalás

Ez a cikk a Visual C++-ból a Microsoft Office-ba történő automatizálással kapcsolatos gyakori kérdésekre ad választ.

További információ

Tartalomjegyzék

  1. Mi az az Automation?

  2. Most ismerkedem az Automationnel, hol találhatok további hasznos forrásanyagokat?

  3. Többféleképpen is használhatom az Automationt?

  4. Mi az a COM?  

  5. Hogyan csatolni egy Office-alkalmazás futó példányához?

  6. Hogyan átadni a választható paramétereket?

  7. Hogyan az Office-alkalmazások által közzétett eseményeket?  

  8. Az automatizálási kód túl lassú. Hogyan gyorsíthatom fel a dolgokat?

  9. Mit jelentenek ezek a hatalmas hibaértékek, például -2147352573 vagy 0x80030002?

  10. Mi az a típustár?

  11. Az automatizálási kód a Microsoft Excel 95-ben működött, de a Microsoft Excel 97-ben meghiúsult. Miért van ez így?

  12. Miért marad a memóriában az alkalmazás, amelyet automatizálok a program befejezése után?

  13. Tudom, mit szeretnék tenni Microsoft Office-alkalmazásfelhasználóként, de hogyan tehetem ezt programozott módon az Automation használatával?

  14. Automatizálhatok beágyazott Microsoft Office-alkalmazásokat?

  15. Hogyan hozzáférni a dokumentumtulajdonságokhoz egy Microsoft Office-dokumentumban?

Kérdések és válaszok

  1. Mi az az Automation? Az Automation (korábbi nevén OLE Automation) egy olyan technológia, amely lehetővé teszi, hogy kihasználja egy meglévő program funkcióit, és beépítse azt a saját alkalmazásaiba. Használhatja például a Microsoft Word helyesírás- és nyelvhelyesség-ellenőrzési képességeit az alkalmazásban anélkül, hogy a Microsoft Word láthatóvá válik a felhasználók számára. A Microsoft Excel összes diagram-, nyomtatási és adatelemző eszközét is használhatja. Ez a technológia jelentősen leegyszerűsítheti és felgyorsíthatja a fejlesztést.  

  2. Most ismerkedem az Automationnel, hol találhatok további hasznos forrásanyagokat? David Kruglinski "Inside Visual C++" (ISBN:1-57231-565- 2) című cikkének 24. fejezete általános áttekintést és néhány nagyszerű példát is bemutat. Emellett a Microsoft Tudásbázis is jó információforrás.Ha inkább példa alapján szeretne tanulni, tekintse meg a Következő cikket a Microsoft Tudásbázisban:  

    179706 ÚTMUTATÓ Az Excel automatizálása az MFC-vel & Új munkafüzet létrehozása/formázása

  3. Többféleképpen is használhatom az Automationt? Az Automation három alapvető módon használható: MFC, #import és C/C++:  

    • Az MFC-vel a Visual C++ ClassWizard használatával hozzon létre "burkolóosztályokat" a Microsoft Office típustáraiból. Ezek az osztályok, valamint más MFC-osztályok, például a COleVariant, a COleSafeArray és a COleException leegyszerűsítik az Automation feladatait. Ez a módszer általában a többihez képest ajánlott, és a Legtöbb Microsoft Tudásbázis-példa MFC-t használ.

    • #import, a Visual C++ 5.0-val elérhetővé vált új direktíva VC++ "intelligens mutatókat" hoz létre egy adott típustárból. Nagyon hatékony, de gyakran nem ajánlott hivatkozásszámlálási problémák miatt, amelyek általában a Microsoft Office-alkalmazásokkal együtt fordulnak elő.

    • A C/C++ automatizálás sokkal nehezebb, de néha szükséges az MFC-vel kapcsolatos többletterhelés vagy a #import kapcsolatos problémák elkerülése érdekében. Alapvetően olyan API-kkal dolgozik, mint a CoCreateInstance() és a COM-felületek, például az IDispatch és az IUnknown.

    Fontos megjegyezni, hogy a C++ és az egyszerű C közötti automatizálás között van némi különbség, mivel a COM a C++ osztály köré lett tervezve.  

  4. Mi az a COM? Az automatizálás a komponensobjektum-modellen (COM) alapul. A COM egy interfészeken alapuló szabványos szoftverarchitektúra, amely úgy lett kialakítva, hogy a kódot önálló objektumokra bontsa. Gondoljon rá úgy, mint az Object Oriented Programming (OOP) paradigma kiterjesztéseként, de különálló alkalmazásokra alkalmazható. Minden objektum egy interfészkészletet tesz elérhetővé, és az objektumok felé irányuló összes kommunikáció, például az inicializálás, az értesítések és az adatátvitel ezeken a felületeken keresztül történik.A COM az operációs rendszerrel telepített dinamikus csatolású kódtárak (DLL-ek) által nyújtott szolgáltatások halmaza. Az Automation számos ilyen szolgáltatást használ. Ilyen például a "Marshalling" szolgáltatás, amely az ügyfélalkalmazás hívásait a kiszolgálóalkalmazás felületeinek tagfüggvényeibe csomagolja, és ezeket az argumentumokkal együtt továbbítja a kiszolgálóalkalmazásnak. Úgy tűnik, hogy a kiszolgáló felületei az ügyfél memóriájában vannak elérhetővé téve, ami nem igaz, ha az ügyfél egy .exe fut a saját folyamatterületén. A rendezés a kiszolgáló metódusaiból is visszaadja a visszaadott értékeket a folyamathatárokon keresztül, és biztonságosan az ügyfél hívásának kezébe kerül. Az Automation számos egyéb szolgáltatással rendelkezik, amelyeket a különböző COM-kódtárak biztosítanak. Ezekről többek között kraig Brockschmidt Inside Ole – Second Edition, ISBN 1-55615-843-2, "Inside COM" by Dale Rogerson - ISBN 1-57231-349-8 és "Automation Programozói referencia", ISBN 1-57231-584-9.

  5. Hogyan csatolni egy Office-alkalmazás futó példányához? Használja a GetActiveObject() API-t. Az Automation-kiszolgálók a RegisterActiveObject() API-n keresztül regisztrálják magukat a ROT -ban (futó objektumtáblában). Az Automation-ügyfelek az alábbi kóddal juthatnak hozzá a futó példányhoz:  

          // Translate server ProgID into a CLSID. ClsidFromProgID
          // gets this information from the registry.
          CLSID clsid;
          CLSIDFromProgID(L"Excel.Application", &clsid);  
    
          // Get an interface to the running instance, if any..
          IUnknown *pUnk;
          HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);
    
          ASSERT(!FAILED(hr));
    
          // Get IDispatch interface for Automation...
          IDispatch *pDisp;
          hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pDisp);
          ASSERT(!FAILED(hr));
    
          // Release the no-longer-needed IUnknown...
          pUnk->Release();
    
    

    MEGJEGYZÉS: Ha a csatolni kívánt Office-alkalmazás több példányt is futtat, csak a GetActiveObject() API-val elindított első példányhoz tud csatolni.Elméletileg az egyes példányok ROT-ját iterálhatja, de az Office-appok nem regisztrálják magukat, ha egy másik példány már szerepel a ROT-ban, mert a moniker önmagában mindig ugyanaz (ezt egyébként nem lehetett megkülönböztetni). Ez azt jelenti, hogy az első kivételével egyetlen példányhoz sem csatolható. Mivel azonban az Office-appok a rotációban is regisztrálják a dokumentumaikat, sikeresen csatolhat más példányokhoz úgy, hogy iterálja a ROT-t, megkeres egy adott dokumentumot, csatolja azt, majd lekérte belőle az Application objektumot.Ezt a PowerPoint esetében nem kell megtennie, mert ez egy egypéldányos alkalmazás; csak egy példánya futtatható.

  6. Hogyan adja át a választható paramétereket? Egyes metódusok "nem kötelező" paraméterekkel rendelkeznek. A Visual Basicben véletlenül kihagyhatja őket a metódus meghívásakor. A Visual C++ használatával történő híváskor azonban egy speciális VARIANT értéket kell megadnia, amelynek .vt mezője VT_ERROR, a .scode mező pedig DISP_E_PARAMNOTFOUND. Az:  

          // VARIANT used in place of optional-parameters.
          VARIANT varOpt;
          varOpt.vt = VT_ERROR;
          varOpt.scode = DISP_E_PARAMNOTFOUND;
    

    A Visual Basic valójában ezt teszi a háttérben.

  7. Hogyan az Office-alkalmazások által közzétett eseményeket? Alapvetően megvalósítja a elkapni kívánt eseményfelületet (a "fogadót"), és beállít egy tanácsadói kapcsolatot az alkalmazással (a "forrás").A tanácsadási kapcsolat beállításához általában lekérheti a kiszolgáló IConnectionPointContainer kiszolgálóját, és meghívhatja a FindConnectionPoint() elemet az eseményfelület IID azonosítójával. Ez egy IConnectionPoint-felületet biztosít, és mindössze annyi maradt, hogy meghívja az Advise() függvényt az eseményfelület egy példányával. Az ilyen események bekövetkezésekor a kiszolgáló visszahívja ezt a felületet.

  8. Az automatizálási kód túl lassú. Hogyan gyorsíthatom fel a dolgokat? Az Automation sebességproblémáinak gyakori oka az adatok ismétlődő olvasása és írása. Ez jellemző az Excel Automation-ügyfelekre. A legtöbben azonban nem tudják, hogy ezek az adatok általában egyszerre írhatók vagy olvashatók a SAFEARRAY használatával. További információért és informatív példákért tekintse meg a Microsoft Tudásbázis következő cikkét:

    179706 ÚTMUTATÓ: Az Excel automatizálása és új munkafüzet létrehozása/formázása az MFC használatával Emellett fontos kiemelni, hogy a vágólap használata néha javíthatja a teljesítményt. Másolhatja például az adatokat a vágólapra, majd automatizálással megadhatja a kiszolgálónak, hogy illessze be az adatokat. Vagy fordítva; kérje meg a kiszolgálót, hogy másolja a vágólapra, és illessze be az alkalmazást.

  9. Mit jelentenek ezek a hatalmas hibaértékek, például -2147352573 vagy 0x80030002? Ezeket az értékeket HRESULT-oknak nevezzük, és a winerror.h fájlban vannak definiálva. A számok azért olyan nagyok, mert az első bit jelzi, hogy hibaeredmény-e. Ezeket a számokat a Visual C++ ErrLook.Exe segédprogrammal lefordíthatja értelmezhető leírásokká.Ha programozott módon szeretné lekérte a hibák leírását, használja a FormatMessage() API-t.

    MEGJEGYZÉS: Ha Visual C++ 6.0-t használ, és van egy változója, amely ezt az értéket tartalmazza a hibakeresési óraablakban, fűzze hozzá a ", hr" karaktert (idézőjelek nélkül), hogy a Visual C++ lefordítsa Önnek!

  10. Mi az a típustár? A típustárak hasonlóak a C/C++ fejlécfájlokhoz. Tartalmazza a kiszolgáló által közzétett felületeket, metódusokat és tulajdonságokat. A típustárat a Visual C++-hoz tartozó OLE/COM objektummegjelenítővel (Oleview.exe) tekintheti meg. Íme egy lista a Microsoft Office 95, 97 és 2000 kódtárfájlneveinek típusáról: Office-alkalmazás | Típustár ------------------------+---------------- Word 95 és korábbi | wb70en32.tlb Excel 95 és korábbi | xl5en32.olb PowerPoint 95 és korábbi | Powerpoint.tlb Access 95 és korábbi | msaccess.tlb Iratgyűjtő 95 | binder.tlb Schedule+ | sp7en32.olb Project | pj4en32.olb Csapatvezetői | mstmgr1.olb Word 97 | msword8.olb Excel 97 | excel8.olb PowerPoint 97 | msppt8.olb Access 97 | msacc8.olb Iratgyűjtő 97 | msbdr8.olb Graph 97 | graph8.olb Outlook 97 | msoutl8.olb Outlook 98 | msoutl85.olb Word 2000 | msword9.olb Excel 2000 | excel9.olb PowerPoint 2000 | msppt9.olb Access 2000 | msacc9.olb Outlook 2000 | msoutl9.olb Word 2002 | msword.olb Excel 2002 | excel.exe PowerPoint 2002 | msppt.olb Access 2002 | msacc.olb Outlook 2002 | msoutl.olb  

  1. Az automatizálási kódom működött az Excel 95-ben, de az Excel 97-ben meghiúsult. Mi történik? Az Excel objektummodellje jelentősen módosította a 95-ös verziót a 97-es verzióra. Az Excel 95 az összes metódusát és tulajdonságát az IDispatch egyetlen implementációjában implementálta. Ez azt jelentette, hogy gyakran lehetett meghívni az X objektumhoz tartozó metódusokat az Y objektumból. Ez nem volt jó terv, ezért az Office 97-ben minden objektumnak saját külön Idispatch implementációja van. Ez azt jelenti, hogy ha az X objektumból egy metódust vagy tulajdonságot kér egy külön Y objektumból, a következő hibaüzenet jelenik meg: 0x80020003, -2147352573, "A tag nem található". A hiba elkerülése érdekében meg kell győződnie arról, hogy a mögöttes IDispatch-felület, amelyről hívásokat kezdeményez, szemantikailag helyes.  

  2. Az automatizálni próbáló alkalmazás a program befejezése után is a memóriában marad. Mi történik? Valószínűleg azért, mert elfelejtette kiadni a beszerzett felületet, és nyomon kell követnie. Íme néhány általános javaslat és a keresendő dolgok:  

    • Ha #import használ, nagyon valószínű, hogy a hozzá társított hivatkozásszámláló hibák valamelyikébe ütközik. Gyakran előfordul, hogy a hibák megkerülhetők, de általában a többi Automation-módszer egyikét érdemes használni. #import nem működik jól az Office-alkalmazásokkal, mert a típustárak és a használat meglehetősen összetett. Az ilyen hivatkozásszámlálási problémákat nehéz nyomon követni, mert a felületszintű COM-hívások nagy része a háttérben van #import használatakor.

    • Ellenőrizze, hogy olyan metódust hív-e meg(például Open vagy New), amely IDispatch * (LPDISPATCH) értéket ad vissza, és figyelmen kívül hagyja a visszatérési értéket. Ha igen, akkor megszakítja ezt a visszaadott felületet, és módosítania kell a kódot, hogy felszabadítsa, amikor már nincs rá szükség.

    • Fokozatosan tegye megjegyzésbe a kód szakaszait, amíg a probléma eltűnik, majd adja hozzá újra, hogy pontosan nyomon kövesse a probléma kezdetét.

    • Vegye figyelembe, hogy egyes alkalmazások továbbra is futni fognak, ha a felhasználó "megérintette" az alkalmazást. Ha ez az automatizálás során történik, akkor az alkalmazás valószínűleg később is futni fog. Az Office-alkalmazások rendelkeznek egy "UserControl" tulajdonságmal az Alkalmazás objektumon, amely olvasható/írható a viselkedés módosításához.

    • Emellett egyes alkalmazások úgy döntenek, hogy továbbra is futnak, ha elegendő felhasználói felületi "művelet" történt. Ha azt tervezi, hogy az alkalmazás kilép, hívja meg a Quit() metódust az Application objektumon. A Word a referenciák számától függetlenül leáll, amikor a rendszer meghívja a Kilépés parancsot. Ez nem várt COM-viselkedés. Az Excel azonban megfelelően elrejti magát, de addig fut, amíg az összes kiemelkedő felületet ki nem adja. Általánosságban elmondható, hogy minden függőben lévő hivatkozást fel kell szabadítania, és csak akkor hívja meg a Quit() függvényt, ha azt tervezi, hogy az alkalmazás kilép.

  3. Tudom, mit szeretnék tenni Office-alkalmazásfelhasználóként, de hogyan tehetem ezt programozott módon az Automationben? Az érdekli, hogy milyen objektumokat, metódusokat és tulajdonságokat kell használnia. A Makrórögzítő használatával a legjobban úgy ismerheti meg, hogyan navigálhat a Word, az Excel és a PowerPoint objektummodelljeiben a felhasználóként használni kívánt műveletek alapján. Egyszerűen válassza a Makró\'Új makró rögzítése' lehetőséget az Eszközök menüben, hajtsa végre a kívánt feladatot, majd válassza a Makró\'Rögzítés leállítása' lehetőséget. Ha végzett a felvétellel, válassza az Eszközök menü Makrók\Makrók elemét, jelölje ki a rögzített makrót, majd kattintson a Szerkesztés gombra. Ezzel megnyitja a létrehozott VBA-kódot, amely elvégzi a rögzített feladatot. Ne feledje, hogy a rögzített makró a legtöbb esetben nem a lehető legjobb kód, de egy gyors példához nagyon jól működik.

  4. Automatizálhatok beágyazott Office-alkalmazásokat? Teljesen. A trükk az IDispatch-mutató lekérése: ezt a Visual C++ Technical Note 39 (TN039) adja meg.  

  5. Hogyan hozzáférni a dokumentumtulajdonságokhoz egy Office-dokumentumban? A dokumentumtulajdonságok az Automation vagy közvetlenül az IPropertyStorage segítségével érhetők el.  

További segítségre van szüksége?

További lehetőségeket szeretne?

Fedezze fel az előfizetés előnyeit, böngésszen az oktatóanyagok között, ismerje meg, hogyan teheti biztonságossá eszközét, és így tovább.