Office Automation met Visual C++


Samenvatting


In dit artikel vindt u antwoorden op veelgestelde vragen over automatisering van Microsoft Office via Visual C++.

Meer informatie


Inhoudsopgave

  1. Wat is automatisering?
  2. Ik ben nieuw bij automatisering en waar vind ik goede bronnen voor meer informatie?
  3. Zijn er verschillende manieren om automatisering te gebruiken?
  4. Wat is COM?
  5. Hoe kan ik een Office-toepassing met de uitvoering toevoegen?
  6. Hoe geef ik optionele parameters door?
  7. Hoe kan ik de gebeurtenissen die worden weergegeven in Office-toepassingen ondervangen?
  8. Mijn automatiseringscode is te traag. Hoe kan ik alles versnellen?
  9. Wat betekenen deze enorme foutwaarden, zoals-2147352573 of 0x80030002, gemiddelde?
  10. Wat is een typebibliotheek?
  11. Mijn automatiseringscode werkte met Microsoft Excel 95, maar mislukt met Microsoft Excel 97. Hoe?
  12. Waarom werkt de toepassing het automatiseren van de toepassing in het geheugen na voltooiing van het programma?
  13. Ik weet wat ik wil doen als gebruiker van een Microsoft Office-toepassing, maar hoe kan ik dit via programmacode uitvoeren via automatisering?
  14. Kan ik een ingesloten Microsoft Office-toepassing automatiseren?
  15. Hoe open ik de documenteigenschappen in een Microsoft Office-document?

Vragen en antwoorden

  1. Wat is automatisering? Automatisering (voorheen OLE-automatisering) is een technologie die u kunt gebruiken om te profiteren van de functionaliteit van een bestaand programma en deze op te nemen in uw eigen toepassingen. U kunt bijvoorbeeld de spelling-en grammaticacontrole van Microsoft Word gebruiken in de toepassing zonder dat Microsoft Word zichtbaar is voor uw gebruikers. U kunt zelfs alle hulpmiddelen voor grafieken, afdrukken en gegevensanalyse van Microsoft Excel gebruiken. Met deze technologie kunt u uw ontwikkeling veel eenvoudiger maken en versnellen.
  2. Ik ben nieuw bij automatisering en waar vind ik goede bronnen voor meer informatie? Hoofdstuk 24 van David Kruglinski "in Visual C++" (ISBN: 1-57231-565-2) bieden een algemeen overzicht en enkele geweldige voorbeelden. Daarnaast is de Microsoft Knowledge Base een goede bron van informatie. Dit artikel is een goede begindatum en u vindt meer specifieke verwijzingen in het volgende artikel in de Microsoft Knowledge Base:
    152023 Bronnen vinden om onderzoek te doen naar OLE-automatisering
    Zie het volgende artikel in Microsoft Knowledge Base voor meer informatie over de voorkeuren:
    179706 Een nieuwe werkmap maken/opmaken met MFC door MFC te automatiseren &
  3. Zijn er verschillende manieren om automatisering te gebruiken? Er zijn drie basismanieren waarop u automatisering kunt gebruiken: MFC, #import en C/C++:
    • Met MFC maakt u met de ClassWizard van de Microsoft Office-typebibliotheek ' wrappers-klassen '. Deze klassen, en andere MFC-klassen, zoals COleVariant, COleSafeArray, COleException, vereenvoudigen de automatiseringstaken. Deze methode is meestal te bevelen voor de andere en de meeste van de Microsoft Knowledge Base-voorbeelden gebruiken MFC.
    • #import, een nieuwe instructie die beschikbaar is met Visual C++ 5,0, maakt VC + + ' slimme aanwijzers ' in een opgegeven typebibliotheek. Het is zeer krachtig, maar vaak niet aanbevolen vanwege problemen met de verwijzing die meestal optreden wanneer ze worden gebruikt met de Microsoft Office-toepassingen.
    • Automatisering van C/C++ is veel moeilijker, maar soms wel noodzakelijk om te voorkomen dat u overgaat op de beschikbare problemen met MFC, of problemen met #import. In plaats daarvan kunt u met Api's werken als CoCreateInstance () en COM-interfaces zoals IDispatch en IUnknown.
    Het is belangrijk te weten dat er enkele kleine verschillen zijn tussen automatisering van C++, vergeleken met gewone C, omdat COM is ontworpen rond de C++-klasse. Voor meer informatie raadpleegt u het volgende artikel in de Microsoft Knowledge Base voor een C-voorbeeld:
    181473 PROCEDURE: OLE-automatisering van een C-toepassing gebruiken
  4. Wat is COM? Automatisering is gebaseerd op het component object model (COM). COM is een standaardsoftware architectuur op basis van interfaces, en is bedoeld om code te onderscheiden in objecten die op de zelfstandige objecten zijn opgeslagen. Beschouw dit als een uitbreiding van de objectgeoriënteerd (object oriented programming), maar ook van toepassing op afzonderlijke toepassingen. Met elk object wordt een set interfaces getoond, en alle communicatie met een object, zoals initialisatie, meldingen en gegevensoverdracht, gebeurt via deze interfaces. COM is ook een reeks services geleverd door Dll's (Dynamic Link Libraries) die met het besturingssysteem zijn geïnstalleerd. Automatisering gebruikt veel van deze services. Een voorbeeld hiervan is de ' marshalling '-service, die de oproepen van de clienttoepassing tot de lid-functies van de server toepassingsinterface verstuurt en die, met hun argumenten, doorgegeven aan de servertoepassing. Het lijkt erop dat de interface van de server wordt weergegeven op de geheugenruimte van de client, wat niet het geval is wanneer de client een exe-bestand in een eigen procesruimte uitvoert. Met de functie samentrekken worden ook de retourwaarden van de servermethoden weer langs de grenzen van het proces weergegeven en in de handen van de client van de client veilig. Er zijn diverse andere services die essentieel zijn voor automatisering die worden geleverd door de verschillende COM-bibliotheken. Bronnen met informatie over de bronnen in de OLE-tweede editie van Kraig Brockschmidt, ISBN 1-55615-843-2, "binnen COM" door Dale Rogerson's-ISBN 1-57231-349-8 en "naslaginformatie over automatisering programmeurs" ISBN 1-57231-584-9.
  5. Hoe kan ik een Office-toepassing met de uitvoering toevoegen? Gebruik de GetActiveObject ()-API. Automatiseringsservers registreren zichzelf in de ROT (Running object Table), via de RegisterActiveObject-API (). Automatiserings clients kunnen op de running-versie met code werken, zoals:
          // 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();
    Opmerking: als er meerdere exemplaren worden uitgevoerd van de Office-toepassing die u wilt koppelen, kunt u alleen een koppeling maken naar het eerste exemplaar dat is gestart met de API van GetActiveObject (). Theoretisch kunt u de ROT voor elk afzonderlijk exemplaar opzeggen, maar de Office-apps registreren niet zichzelf als u al een ander exemplaar in de ROT hebt omdat de bijnaam van de persoon altijd gelijk is (deze kan niet worden onderscheiden). Dit betekent dat u niet kunt bijvoegen met een willekeurig exemplaar dan de eerste. Aangezien de Office-apps ook hun documenten registreren in de ROT, kunt u een koppeling tot stand worden gebracht met de ROT die op zoek bent naar een bepaald document, het document bijvoegen en het Application-object ophalen. Het volgende Microsoft Knowledge Base-artikel bevat enkele code voor het doorlopen van de ROT en het zoeken naar een documentnaam:
    190985 PROCEDURE: IDispatch van een Excel-of Word-document uit een OCX-bestand weergeven
    U hoeft dit niet voor PowerPoint uit te voeren omdat het een toepassing van één exemplaar is. Er kan maar één exemplaar van de toepassing worden uitgevoerd.
  6. Hoe geef ik optionele parameters door? Voor sommige methoden bestaan optionele parameters. U kunt in Visual Basic ongeen niet weglaten wanneer u de methode aanroept. Wanneer u een oproep uitvoert met Visual C++, moet u echter een speciale VARIANT doorgeven, waarvan het veld met de VT-DISP_E_PARAMNOTFOUND is VT_ERROR en. scode veld. Dat is:
          // VARIANT used in place of optional-parameters.      VARIANT varOpt;      varOpt.vt = VT_ERROR;      varOpt.scode = DISP_E_PARAMNOTFOUND;
    Dit is echt wat Visual Basic doet achter de schermen.
  7. Hoe kan ik de gebeurtenissen die worden weergegeven in Office-toepassingen ondervangen? U implementeert in principe de gebeurtenisinterface die u wilt ondervangen (de Sink) en installeert een adviserende verbinding met de toepassing (de bron). In het volgende artikel vindt u stapsgewijze voorbeelden van Microsoft Word:
    183599 PROCEDURE: Microsoft Word97-toepassingsgebeurtenissen afvangen met VC + +
    Voor het instellen van de adviserende verbinding kunt u de IConnectionPointContainer van de server en de FindConnectionPoint () bellen met de IID van de gebeurtenisinterface. Dit geeft u een IConnectionPoint-interface en alles wat u hoeft te doen, is een instantie van uw evenementen interface. De server belt vervolgens via deze interface terug wanneer deze gebeurtenissen plaatsvinden.
  8. Mijn automatiseringscode is te traag. Hoe kan ik alles versnellen? Een veelvoorkomende oorzaak van de snelheidsproblemen met automatisering is dat gegevens steeds opnieuw worden gelezen en geschreven. Dit is gebruikelijk voor Excel Automation-clients. De meeste mensen weten niet dat deze gegevens meestal allemaal tegelijk kunnen worden geschreven of gelezen met behulp van SAFEARRAY. Raadpleeg de volgende Microsoft Knowledge Base-artikelen voor meer informatie en informatieve voorbeelden:
    186120 PROCEDURE: MFC gebruiken om Excel te automatiseren en een bereik in te vullen met een matrix
    186122 PROCEDURE: MFC gebruiken om Excel te automatiseren & een matrix te verkrijgen van een bereik
    179706 PROCEDURE: MFC gebruiken om Excel te automatiseren en een nieuwe werkmap te maken/opmaken
    Het is belangrijk dat u de prestaties van het Klembord vergemakkelijkt. Voorbeeld: u kunt uw gegevens naar het Klembord kopiëren en vervolgens automatisering gebruiken om te informeren dat de server wordt geplakt. Of vice versa; Meld u aan bij de server om naar het Klembord te kopiëren en plak deze in de toepassing.
  9. Wat betekenen de grote foutwaarden, zoals-2147352573, of 0x80030002? Deze waarden zijn bekend als HRESULTs en zijn gedefinieerd in winerror. h. De getallen zijn zo groot omdat de eerste bit aangeeft of het een foutresultaat is. U kunt het hulpprogramma ErrLook. exe gebruiken dat deel uitmaakt van Visual C++, zodat u deze getallen kunt vertalen in zinvolle beschrijvingen. Als u programmatisch een beschrijving voor de fouten wilt krijgen, kunt u de API van FormatMessage () gebruiken. Raadpleeg de volgende Microsoft Knowledge Base-artikelen voor meer informatie en voorbeelden van het gebruik van FormatMessage ():
    186063 INFO: automatiseringsfouten voor VB/VBA ververtalen
    122957 Voorbeeld: Decode32 en Decode16 OLE fout code decoder tools
    Opmerking: als u gebruikmaakt van Visual c++ 6,0 en een variabele hebt die deze waarde bevat in het venster controle van foutopsporing, voegt u het volgende toe: ", HR" (zonder de aanhalingstekens) om het programma te laten vertalen.
  10. Wat is een typebibliotheek? Een typebibliotheek is vergelijkbaar met een kop-of voettekst bestand van C/C++. De interface bevat de interfaces, methoden en eigenschappen van een server die wordt gepubliceerd. U kunt de typebibliotheek weergeven met behulp van de OLE/COM object Viewer (Oleview. exe) die deel uitmaakt van Visual C++. Hier volgt een lijst met de bestandsnamen van de typebibliotheek voor Microsoft Office 95, 97 en 2000:
           Office Application      | Type library       ------------------------+----------------       Word 95 and prior       | wb70en32.tlb       Excel 95 and prior      | xl5en32.olb       Powerpoint 95 and prior | Powerpoint.tlb       Access 95 and prior     | msaccess.tlb       Binder 95               | binder.tlb       Schedule+               | sp7en32.olb       Project                 | pj4en32.olb       Team Manager            | mstmgr1.olb       Word 97                 | msword8.olb       Excel 97                | excel8.olb       Powerpoint 97           | msppt8.olb       Access 97               | msacc8.olb       Binder 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. Mijn automatiseringscode werkte met Excel 95, maar mislukt met Excel 97. Wat gebeurt er? Het object model voor Excel is ingrijpend veranderd van versie 95 naar 97. In Excel 95 worden alle methoden en eigenschappen in één implementatie van IDispatch geïmplementeerd. Dit betekent dat u vaak methoden aanroept voor object X, van object Y. Dit was geen goed ontwerp, dus in Office 97 heeft elk object een eigen afzonderlijke IDispatch-implementatie. Dit betekent dat als u voor een methode of eigenschap van object X uit een apart object Y vraagt, de fout 0x80020003,-2147352573, ' lid niet gevonden ' wordt weergegeven. Om deze fout te voorkomen, moet u ervoor zorgen dat de onderliggende IDispatch-interface waarmee u gaat bellen, de semantische, juiste versie is. Raadpleeg de volgende Microsoft Knowledge Base-artikelen voor meer informatie:
    172108 PROCEDURE: probleemoplossing ' lid is niet gevonden ', 0x80020003-fout
  2. De toepassing die u automatisch automatiseert, blijft in het geheugen staan nadat het programma is voltooid. Wat gebeurt er? Dit is waarschijnlijk omdat u bent vergeten een verworven interface vrij te geven en deze vervolgens moet bijhouden. Hier volgen enkele algemene suggesties en zaken om te zoeken:
    • Als u #import gebruikt, kunt u zeer waarschijnlijk een van de fouten met betrekking tot verwijzingen tellen. Het kan zijn dat de bugs snel kan worden bewerkt, maar meestal is het verstandig een van de andere automatiserings methoden te gebruiken. #import werkt niet goed met de Office-toepassingen, omdat de typebibliotheken en het gebruik tamelijk ingewikkeld zijn. Dit houdt ook in dat de problemen met betrekking tot het meten van verwijzingen moeilijk te vinden zijn omdat een groot aantal COM-gesprekken met interface niveau achter de schermen worden gebruikt #import.
    • Controleer of u gebruikmaakt van een willekeurige methode, zoals open, of nieuw, die een IDispatch *-(LPDISPATCH) retourneert en negeert de retourwaarde. Als dat zo is, moet u deze door u opgegeven interface niet verlaten en moet u de code wijzigen, zodat u deze loslaat wanneer u deze niet meer nodig hebt.
    • U kunt geleidelijk ook secties van de code uitlichten totdat het probleem verdwijnt, en het vervolgens weer op een wille keurigere plaats afmelden om te achterhalen waar het probleem begint.
    • Houd er rekening mee dat sommige toepassingen blijven werken als de gebruiker de toepassing heeft geraken. Als dit het geval is wanneer u automatiseert, blijft de toepassing waarschijnlijk achteraf actief. De Office-toepassingen hebben de eigenschap UserControl van het object Application dat u kunt lezen/schrijven om dit gedrag te wijzigen.
    • In sommige toepassingen wordt ook besloten of er voldoende actie moet worden ondernomen als er voldoende actie is ondernomen voor de gebruikersinterface. Als u de toepassing wilt afsluiten, roept u de methode Quit () aan op het object Application. Word wordt afgesloten, ongeacht het aantal verwijzingen wanneer exit wordt aangeroepen. Dit onverwachte COM-gedrag. Excel verbergt echter wel zichzelf, maar blijft gewoon werken totdat alle uitmuntende interfaces worden uitgebracht. In het algemeen dient u alle openstaande verwijzingen vrij te geven en alleen oproep stoppen () als u van plan bent om de toepassing af te sluiten.
  3. Ik weet wat ik wil doen als gebruiker van Office-toepassing, maar hoe doe ik dit via programmacode via automatisering? Wat u wilt gebruiken, is welke objecten, methoden en eigenschappen u moet gebruiken. De beste manier om te leren hoe u kunt navigeren in de objectmodellen van Word, Excel en PowerPoint, op basis van wat u wilt doen als een gebruiker, is de macro recorder gebruiken. Kies in het menu Extra de optie macro \ ' nieuwe macro opnemen ' en kies vervolgens macro \ ' opname stoppen '. Wanneer u klaar bent met opnemen, kiest u Macro\Macros in het menu Extra, selecteert u de macro die u hebt opgenomen, en klikt u vervolgens op bewerken. U gaat nu naar de gegenereerde VBA-code waarmee de taak die u hebt opgenomen, wordt uitgevoerd. Houd er rekening mee dat de opgenomen macro niet de best mogelijke code is in de meeste gevallen, maar wel een kort voorbeeld.
  4. Kan ik een ingesloten Office-toepassing automatiseren? Absolute. De truc krijgt de IDispatch pointer: deze wordt gegeven in de technische noot 39 (TN039) van Visual C++. Zie het volgende Microsoft Knowledge Base-artikel voor stapsgewijze instructies:
    184663 PROCEDURE: een Microsoft Excel-werkblad insluiten en automatiseren met MFC
  5. Hoe open ik de documenteigenschappen in een Office-document? De documenteigenschappen zijn toegankelijk via automatisering of rechtstreeks via IPropertyStorage. De volgende Microsoft Knowledge Base-artikelen illustreren elke methode:
    179494 PROCEDURE: automatisering gebruiken om ingebouwde document eigenschappen op te halen
    186898 PROCEDURE: direct samengestelde document eigenschappen met VC + + lezen