Mit Microsoft anmelden
Melden Sie sich an, oder erstellen Sie ein Konto.
Hallo,
Wählen Sie ein anderes Konto aus.
Sie haben mehrere Konten.
Wählen Sie das Konto aus, mit dem Sie sich anmelden möchten.

Zusammenfassung

In diesem Artikel werden häufig gestellte Fragen zur Automatisierung von Microsoft Office von Visual C++ beantwortet.

Weitere Informationen

Inhaltsverzeichnis

  1. Was ist Automatisierung?

  2. Wo finde ich gute Ressourcen, um mehr zu erfahren?

  3. Gibt es verschiedene Möglichkeiten für die Verwendung von Automation?

  4. Was ist COM?
     

  5. Gewusst wie an die ausgeführte Instanz einer Office-Anwendung anfügen?

  6. Gewusst wie optionale Parameter übergeben?

  7. Gewusst wie Ereignisse abfangen, die von den Office-Anwendungen verfügbar gemacht werden?
     

  8. Mein Automatisierungscode ist zu langsam. Wie kann ich die Dinge beschleunigen?

  9. Was bedeuten diese riesigen Fehlerwerte wie -2147352573 oder 0x80030002?

  10. Was ist eine Typbibliothek?

  11. Mein Automatisierungscode funktionierte mit Microsoft Excel 95, schlägt aber mit Microsoft Excel 97 fehl. Woran liegt das?

  12. Warum bleibt die Anwendung, die ich automatisiere, im Arbeitsspeicher, nachdem mein Programm abgeschlossen ist?

  13. Ich weiß, was ich als Microsoft Office-Anwendungsbenutzer tun möchte, aber wie kann ich dies programmgesteuert mithilfe von Automation tun?

  14. Kann ich eine eingebettete Microsoft Office-Anwendung automatisieren?

  15. Gewusst wie auf meine Dokumenteigenschaften in einem Microsoft Office-Dokument zugreifen?

Fragen und Antworten

  1. Was ist Automatisierung?

    Automatisierung (früher OLE-Automatisierung) ist eine Technologie, mit der Sie die Funktionen eines vorhandenen Programms nutzen und in Ihre eigenen Anwendungen integrieren können. Beispielsweise können Sie die Microsoft Word-Rechtschreib- und Grammatikprüfungsfunktionen in Ihrer Anwendung nutzen, ohne dass Microsoft Word für Ihre Benutzer sichtbar ist. Sie können sogar alle Microsoft Excel-Diagramm-, Druck- und Datenanalysetools verwenden. Diese Technologie kann Ihre Entwicklung erheblich vereinfachen und beschleunigen.
     

  2. Wo finde ich gute Ressourcen, um mehr zu erfahren? Kapitel 24 von David Kruglinskis "Inside Visual C++" (ISBN:1-57231-565-2) bietet einen allgemeinen Überblick sowie einige großartige Beispiele. Darüber hinaus ist die Microsoft Knowledge Base eine gute Informationsquelle.
    Wenn Sie lieber anhand von Beispielen lernen möchten, lesen Sie den folgenden Artikel in der Microsoft Knowledge Base:
     

    179706 HOWTO Use MFC to Automate Excel & Create/Format a New Workbook

  3. Gibt es verschiedene Möglichkeiten für die Verwendung von Automation?

    Es gibt drei grundlegende Möglichkeiten zur Verwendung von Automation: MFC, #import und C/C++:
     

    • Verwenden Sie mit MFC den Visual C++-Klassenwizard, um "Wrapperklassen" aus den Microsoft Office-Typbibliotheken zu generieren. Diese Klassen sowie andere MFC-Klassen wie COleVariant, COleSafeArray, COleException vereinfachen die Aufgaben der Automatisierung. Diese Methode wird in der Regel gegenüber den anderen empfohlen, und die meisten Microsoft Knowledge Base-Beispiele verwenden MFC.

    • #import, einer neuen Direktive, die mit Visual C++ 5.0 verfügbar wurde, erstellt VC++-"intelligente Zeiger" aus einer angegebenen Typbibliothek. Es ist sehr leistungsfähig, wird aber aufgrund von Problemen mit der Verweiszählung, die in der Regel bei der Verwendung mit den Microsoft Office-Anwendungen auftreten, nicht empfohlen.

    • C/C++-Automatisierung ist viel schwieriger, aber manchmal notwendig, um Mehraufwand mit MFC oder Probleme mit #import zu vermeiden. Im Grunde arbeiten Sie mit APIs wie CoCreateInstance() und COM-Schnittstellen wie IDispatch und IUnknown.

    Es ist wichtig zu beachten, dass es einige geringfügige Unterschiede zwischen Automation von C++ und einfachem C gibt, da COM um die C++-Klasse herum entworfen wurde.
     

  4. Was ist COM?

    Die Automatisierung basiert auf dem Component Object Model (COM). COM ist eine Standardsoftwarearchitektur, die auf Schnittstellen basiert und so konzipiert ist, dass Code in eigenständige Objekte unterteilt wird. Stellen Sie sich dies als Erweiterung des OOP-Paradigmas (Object Oriented Programming) vor, ist aber für separate Anwendungen anwendbar. Jedes Objekt macht eine Reihe von Schnittstellen verfügbar, und die gesamte Kommunikation mit einem Objekt, z. B. Initialisierung, Benachrichtigungen und Datenübertragung, erfolgt über diese Schnittstellen.

    COM ist auch eine Reihe von Diensten, die von dynamic-link libraries (DLLs) bereitgestellt werden, die mit dem Betriebssystem installiert werden. Die Automatisierung verwendet viele dieser Dienste. Ein Beispiel ist der Dienst "Marshalling", der die Aufrufe der Clientanwendung an die Memberfunktionen der Schnittstellen der Serveranwendung packt und diese mit ihren Argumenten an die Serveranwendung übergibt. Dies lässt den Eindruck entstehen, dass die Schnittstellen des Servers im Arbeitsspeicher des Clients verfügbar gemacht werden. Dies ist nicht der Fall, wenn der Client ein .exe ist, der in seinem eigenen Prozessbereich ausgeführt wird. Beim Marshallen werden auch die Rückgabewerte von den Methoden des Servers über die Prozessgrenzen hinweg und sicher in die Hände des Clientaufrufs zurückgerufen. Es gibt viele weitere wichtige Dienste für die Automatisierung, die von den verschiedenen COM-Bibliotheken bereitgestellt werden. Zu diesen Quellen gehören "Inside Ole - Second Edition" von Kraig Brockschmidt, ISBN 1-55615-843-2, "Inside COM" von Dale Rogerson - ISBN 1-57231-349-8 und "Automation Programmer es Reference", ISBN 1-57231-584-9.

  5. Gewusst wie an die ausgeführte Instanz einer Office-Anwendung anfügen?

    Verwenden Sie die GetActiveObject()-API. Automatisierungsserver registrieren sich über die RegisterActiveObject()-API in der ROT(Running Object Table). Automatisierungsclients können die ausgeführte Instanz mit Code wie folgendem abrufen:

     

          // 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();
    
    

    HINWEIS: Wenn mehrere Instanzen der Office-Anwendung ausgeführt werden, die Sie anfügen möchten, können Sie nur an die erste Instanz anfügen, die mithilfe der GetActiveObject()-API gestartet wurde.

    Theoretisch können Sie den ROT-Wert für jede einzelne Instanz durchlaufen, aber die Office-Apps registrieren sich nicht selbst, wenn sich bereits eine andere Instanz in der ROT-Instanz befindet, da der Moniker für sich selbst immer gleich ist (er konnte sowieso nicht unterschieden werden). Dies bedeutet, dass Sie mit Ausnahme der ersten Instanz keine Instanz anfügen können. Da die Office-Apps jedoch auch ihre Dokumente in der ROT registrieren, können Sie erfolgreich an andere Instanzen anfügen, indem Sie die ROT-Datei durchlaufen, nach einem bestimmten Dokument suchen, an das Dokument anfügen und dann das Application-Objekt daraus abrufen.
    Sie müssen dies nicht für PowerPoint tun, da es sich um eine Einzelinstanzanwendung handelt. Sie können nur eine Instanz davon ausführen.

  6. Gewusst wie optionale Parameter übergeben?

    Einige Methoden verfügen über "optionale" Parameter. In Visual Basic können Sie sie beim Aufrufen der -Methode beiläufig weglassen. Beim Aufrufen mit Visual C++ müssen Sie jedoch einen speziellen VARIANT-Wert übergeben, dessen VT-Feld VT_ERROR ist und das SCODE-Feld DISP_E_PARAMNOTFOUND ist. Das heißt:
     

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

    Dies ist wirklich das, was Visual Basic im Hintergrund tut.

  7. Gewusst wie Ereignisse abfangen, die von den Office-Anwendungen verfügbar gemacht werden?

    Im Grunde implementieren Sie die Ereignisschnittstelle, die Sie abfangen möchten (die "Senke"), und richten eine Empfehlungsverbindung mit der Anwendung (die "Quelle") ein.

    Im Allgemeinen rufen Sie zum Einrichten der Empfehlungsverbindung den IConnectionPointContainer des Servers ab und rufen FindConnectionPoint() mit der IID der Ereignisschnittstelle auf. Dadurch erhalten Sie eine IConnectionPoint-Schnittstelle, und sie müssen nur noch Advise() mit einer Instanz Ihrer Ereignisschnittstelle aufrufen. Der Server ruft dann über diese Schnittstelle zurück, wenn diese Ereignisse auftreten.

  8. Mein Automatisierungscode ist zu langsam. Wie kann ich die Dinge beschleunigen?

    Eine häufige Ursache von Geschwindigkeitsproblemen bei Automation ist das wiederholte Lesen und Schreiben von Daten. Dies ist typisch für Excel Automation-Clients. Den meisten Personen ist jedoch nicht bewusst, dass diese Daten in der Regel mit SAFEARRAY auf einmal geschrieben oder gelesen werden können. Weitere Informationen und informative Beispiele finden Sie im folgenden Microsoft Knowledge Base-Artikel:

    179706 VORGEHENSWEISE: Verwenden von MFC zum Automatisieren von Excel und Erstellen/Formatieren einer neuen Arbeitsmappe
    Außerdem ist es wichtig, darauf hinzuweisen, dass die Verwendung der Zwischenablage manchmal die Leistung verbessern kann. Beispielsweise können Sie Ihre Daten in die Zwischenablage kopieren und dann die Automatisierung verwenden, um den Server zum Einfügen anweisen zu lassen. Oder umgekehrt; Weisen Sie den Server an, in die Zwischenablage zu kopieren und in Ihre Anwendung einzufügen.

  9. Was bedeuten diese riesigen Fehlerwerte wie -2147352573 oder 0x80030002?

    Diese Werte werden als HRESULTs bezeichnet und in winerror.h definiert. Die Zahlen sind so groß, weil das erste Bit angibt, ob es sich um ein Fehlerergebnis handelt. Sie können das in Visual C++ enthaltene Hilfsprogramm ErrLook.Exe verwenden, um diese Zahlen in aussagekräftige Beschreibungen zu übersetzen.

    Wenn Sie programmgesteuert eine Beschreibung für die Fehler abrufen möchten, können Sie die FormatMessage()-API verwenden.

    HINWEIS: Wenn Sie Visual C++ 6.0 verwenden und eine Variable mit diesem Wert im Debugüberwachungsfenster haben, fügen Sie ", hr" (ohne die Anführungszeichen) an, damit Visual C++ sie für Sie übersetzt!

  10. Was ist eine Typbibliothek?

    Eine Typbibliothek ähnelt einer C/C++-Headerdatei. Sie enthält die Schnittstellen, Methoden und Eigenschaften, die ein Server veröffentlicht. Sie können die Typbibliothek mit dem OLE/COM-Objekt-Viewer (Oleview.exe) anzeigen, der in Visual C++ enthalten ist. Hier ist eine Liste der Typenbibliotheksdateinamen für Microsoft Office 95, 97 und 2000:



    Office-Anwendungs-| Typbibliothek
    ------------------------+----------------
    Word 95 und vorherige | wb70en32.tlb
    Excel 95 und frühere | xl5en32.olb
    PowerPoint 95 und frühere | Powerpoint.tlb
    Access 95 und vorherige | msaccess.tlb
    Binder 95 | binder.tlb
    Zeitplan+ | sp7en32.olb
    Projekt | 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
    Abbildung 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. Mein Automatisierungscode funktionierte mit Excel 95, aber mit Excel 97 schlägt er fehl. Was passiert?

    Das Objektmodell für Excel hat eine bedeutende Änderung von Version 95 zu Version 97 vorgenommen. Excel 95 hat alle zugehörigen Methoden und Eigenschaften in einer einzelnen Implementierung von IDispatch implementiert. Dies bedeutete, dass Sie häufig Methoden für Objekt X aus Objekt Y aufrufen konnten. Dies war kein guter Entwurf, daher verfügt jedes Objekt in Office 97 über eine eigene Idispatch-Implementierung. Wenn Sie also eine Methode oder Eigenschaft von Objekt X aus einem separaten Objekt Y anfordern, erhalten Sie den Fehler 0x80020003,-2147352573, "Member nicht gefunden". Um diesen Fehler zu vermeiden, müssen Sie sicherstellen, dass die zugrunde liegende IDispatch-Schnittstelle, von der Aus Aufrufe ausgeführt werden, semantisch korrekt ist.
     

  2. Die Anwendung, die ich automatisiere, bleibt im Arbeitsspeicher, nachdem mein Programm abgeschlossen ist. Was passiert?

    Dies liegt wahrscheinlich daran, dass Sie vergessen haben, eine erworbene Schnittstelle freizugeben, und Sie müssen sie nachverfolgen. Im Folgenden finden Sie einige allgemeine Vorschläge und Punkte, nach denen Sie suchen müssen:
     

    • Wenn Sie #import verwenden, ist es sehr wahrscheinlich, dass sie auf einen der damit verbundenen Fehler für die Verweiszählung kommt. Oft können die Fehler behoben werden, aber in der Regel wird es bevorzugt, eine der anderen Automatisierungsmethoden zu verwenden. #import funktioniert nicht sehr gut mit den Office-Anwendungen, da die Typbibliotheken und die Verwendung ziemlich komplex sind. Auch solche Probleme mit der Verweiszählung sind schwer aufzuspüren, da viele DER COM-Aufrufe auf Schnittstellenebene im Hintergrund stehen, wenn #import verwendet werden.

    • Überprüfen Sie, ob Sie Methoden wie Open oder New aufrufen, die ein IDispatch * (LPDISPATCH) zurückgeben, und ignorieren Sie den Rückgabewert. Wenn dies der Fall ist, verlassen Sie diese zurückgegebene Schnittstelle und müssen Ihren Code so ändern, dass Sie ihn freigeben, wenn sie nicht mehr benötigt werden.

    • Kommentieren Sie Schrittweise Abschnitte Ihres Codes aus, bis das Problem verschwindet, und fügen Sie es dann mit Bedacht hinzu, um herauszuverfolgen, wo das Problem beginnt.

    • Beachten Sie, dass einige Anwendungen weiterhin ausgeführt werden, wenn der Benutzer die Anwendung "berührt" hat. Wenn dies während der Automatisierung auftritt, wird die Anwendung wahrscheinlich auch danach ausgeführt. Die Office-Anwendungen verfügen über die Eigenschaft "UserControl" für das Application-Objekt, die Sie lesen/schreiben können, um dieses Verhalten zu ändern.

    • Darüber hinaus entscheiden sich einige Anwendungen, weiterhin aktiv zu bleiben, wenn genügend "Aktion" der Benutzeroberfläche aufgetreten ist. Wenn Sie beabsichtigen, die Anwendung zu beenden, rufen Sie die zugehörige Quit()-Methode für das Application-Objekt auf. Word wird unabhängig von seiner Verweisanzahl heruntergefahren, wenn Quit aufgerufen wird. Dies ist kein erwartetes COM-Verhalten. Excel blendet sich jedoch ordnungsgemäß aus, wird aber weiterhin ausgeführt, bis alle ausstehenden Schnittstellen freigegeben sind. Im Allgemeinen sollten Sie alle ausstehenden Verweise freigeben und nur Quit() aufrufen, wenn Sie beabsichtigen, die Anwendung zu beenden.

  3. Ich weiß, was ich als Office-Anwendungsbenutzer tun möchte, aber wie mache ich dies programmgesteuert über Automatisierung?

    Sie interessieren sich dafür, welche Objekte, Methoden und Eigenschaften Sie verwenden müssen. Die beste Möglichkeit, um zu lernen, wie Sie in den Objektmodellen von Word, Excel und PowerPoint navigieren, basierend auf den Aufgaben, die Sie als Benutzer ausführen möchten, ist die Verwendung der Makroaufzeichnung. Wählen Sie einfach Makro\'Neues Makro aufzeichnen' im Menü Extras aus, führen Sie die für Sie interessante Aufgabe aus, und wählen Sie dann Makro\'Aufzeichnung beenden'. Wählen Sie nach Abschluss der Aufzeichnung im Menü Extras die Option Makro\Makros aus, wählen Sie das makro aus, das Sie aufgezeichnet haben, und klicken Sie dann auf Bearbeiten. Dadurch gelangen Sie zu dem generierten VBA-Code, der die aufgezeichnete Aufgabe erfüllt. Denken Sie daran, dass das aufgezeichnete Makro in den meisten Fällen nicht der bestmögliche Code ist, aber es eignet sich sehr gut für ein schnelles Beispiel.

  4. Kann ich eine eingebettete Office-Anwendung automatisieren?

    Absolut. Der Trick besteht darin, den IDispatch-Zeiger zu erhalten: Dies ist im technischen Hinweis 39 (TN039) von Visual C++ angegeben.
     

  5. Gewusst wie auf meine Dokumenteigenschaften in einem Office-Dokument zugreifen?

    Auf die Dokumenteigenschaften kann über Automation oder direkt über IPropertyStorage zugegriffen werden.
     

Benötigen Sie weitere Hilfe?

Ihre Office-Fähigkeiten erweitern
Schulungen erkunden
Neue Funktionen als Erster erhalten
Microsoft Insider beitreten

War diese Information hilfreich?

Wie zufrieden sind Sie mit der Sprachqualität?
Was hat Ihre Erfahrung beeinflusst?

Vielen Dank für Ihr Feedback!

×