Office-Automatisierung mit Visual C++

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 196776 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Dieser Artikel beantwortet Häufige gestellte Fragen zu Microsoft-Automatisierung Büro von Visual C++.

Weitere Informationen

Inhaltsverzeichnis

  1. Was ist Automatisierung?
  2. Bin ich neu auf die Automatisierung, wo ich finde weitere gute Ressourcen?
  3. Gibt es verschiedene Möglichkeiten, die verwendung von Automatisierung?
  4. Was ist COM?
  5. Wie zuordnen kann ich die ausgeführte Instanz einer Office-Anwendung?
  6. Wie führen Sie die optionalen Parameter werden übergeben?
  7. Wie fangen ich Ereignisse, die von der Office-Anwendungen verfügbar gemacht werden?
  8. Meine Automatisierungscode ist zu langsam. Wie kann ich Dinge beschleunigen?
  9. Was bedeuten diese riesigen Fehlerwerte, wie-2147352573 oder 0x80030002?
  10. Was ist eine Typbibliothek?
  11. Meine Automatisierungscode arbeitete mit Microsoft Excel 95 aber fehlschlägt Microsoft Excel 97. Warum?
  12. Warum bleibt die Anwendung, die ich bin Automatisierung im Speicher nach meinem Programm ist fertig?
  13. Ich weiß, was ich als Microsoft Office Anwendungsbenutzer tun möchten, aber Wie geht das programmgesteuert mithilfe der Automatisierung?
  14. Kann ich eine embedded Microsoft Office-Anwendung automatisieren?
  15. Wie greife ich auf Meine Dokumenteigenschaften in einem Dokument Microsoft Office?

Fragen und Antworten

  1. Was ist Automatisierung?

    Automatisierung (früher OLE-Automatisierung) ist eine Technologie, die Ihnen ermöglicht ein vorhandenes Programm Funktionen nutzen und einbinden in Ihren eigenen Anwendungen. Beispielsweise können Sie Microsoft verwenden. Word Rechtschreib- und Grammatikprüfung, die Funktionen in Ihre Anwendung ohne Microsoft Word für die Benutzer sichtbar. Sie können sogar alle verwenden die Microsoft Excel Diagramme, Drucken und Daten Analyse-Tools. Dies Technologie kann erheblich vereinfachen und beschleunigen Sie Ihre Entwicklung.
  2. Bin ich neu auf die Automatisierung, wo ich finde weitere gute Ressourcen? Kapitel 24 von David Kruglinski's "In Visual C++" (ISBN-57231 - 565 - 2) liefert eine allgemeine Übersicht sowie einige gute Beispiele. Darüber hinaus der Microsoft Knowledge Base ist eine gute Informationsquelle. Dies Artikel selbst ist ein guter Anfang, und finden Sie spezifischere Verweise in der folgenden Artikel der Microsoft Knowledge Base:
    152023 Suchen von Ressourcen auf die Studie OLE-Automatisierung
    Bevorzugen Sie lernen anhand eines Beispiels, finden Sie in folgenden Artikel der Microsoft Knowledge Base:
    179706 So wird 's gemacht verwenden MFC zum Automatisieren von Excel & / Format Erstellen einer neuen Arbeitsmappe
  3. Gibt es verschiedene Möglichkeiten, die verwendung von Automatisierung?

    Es gibt drei grundlegende Möglichkeiten können Sie mithilfe der Automatisierung: MFC, #import, und C/C++:

    • Verwenden Sie mit MFC die Visual C++-Klassen-Assistent "Wrapper generieren Klassen"aus der Microsoft Office-Typbibliotheken. Diese Klassen als sowie andere MFC?Klassen, z. B. COleVariant, COleSafeArray, COleException verfügt, vereinfachen die Aufgaben der Automatisierung. Diese Methode ist in der Regel empfohlen über die anderen, und die meisten von Microsoft Knowledge Base-Beispiele verwenden MFC.
    • #Import, eine neue Richtlinie, die mit Visual C++ 5.0 verfügbar wurde, erstellt VC++-"intelligenten Zeigern", aus einer angegebenen Typbibliothek. Es ist sehr leistungsfähig, aber häufig nicht empfohlen, wegen Referenz - zählen Probleme, die in der Regel treten bei Verwendung mit Microsoft Office-Anwendungen.
    • C/C++-Automatisierung ist viel schwieriger, aber manchmal notwendig, Vermeiden Sie mit MFC-Overhead oder Probleme mit #import. Im Grunde, Sie Arbeiten Sie mit solcher APIs als CoCreateInstance() und COM-Schnittstellen wie IDispatch und IUnknown.
    Es ist wichtig zu beachten, dass es einige leichte Unterschiede zwischen gibt Automatisierung von C++ mit normalem C verglichen, da COM, um entwickelt wurde die C++-Klasse. Weitere Informationen finden Sie in folgenden Artikel der Microsoft Knowledge Base für eine C Beispiel:
    181473 So wird 's gemacht: Verwenden von OLE-Automatisierung aus einer C Anwendung
  4. Was ist COM?

    Automatisierung basiert auf dem Component Object Model (COM). COM ist eine Standard-Software-Architektur basierend auf Schnittstellen und haben soll Code getrennt in eigenständige Objekte. Betrachten sie als Erweiterung des Paradigmas Object Oriented Programming (OOP), aber für Trennen Sie die Anwendungen. Jedes Objekt stellt eine Reihe von Schnittstellen und alle Kommunikation auf ein Objekt, z. B. Initialisierung, Benachrichtigungen, und die Datenübertragung erfolgt über diese Schnittstellen.

    COM ist auch eine Reihe von Dienstleistungen von Dynamic Link Libraries (DLLs) mit dem Betriebssystem installiert. Automatisierung verwendet viele Teilnehmer Dienste. Ein Beispiel ist der Dienst "Marshalling", welche Pakete die Client-Anwendung Aufrufe der Memberfunktionen des Servers Anwendung der Schnittstellen und übergibt die, mit deren Argumente zu den Server-Anwendung. Es wird der Eindruck, dass der Server-Schnittstellen sind verfügbar gemacht werden, in der Client-Speicherbereich, der nicht der Fall ist bei der Client ist eine EXE-Datei in einen eigenen Prozessbereich ausgeführt. Auch Marshalling Ruft die Rückgabewerte von Methoden für die Server über den Prozess zurück Grenzen und sicher in die Hände der Aufruf des Clients. Es gibt viele andere wichtige Dienste für Automatisierung, die von der verschiedene COM-Bibliotheken. Informationen über diese gehören "Inside Ole - Second Edition" von Kraig Brockschmidt, ISBN 1-55615-843-2 "Inside COM" durch Dale Rogerson - ISBN 1-57231-349-8 und "Automation Programmer's Reference,"ISBN 1-57231-584-9.
  5. Wie zuordnen kann ich die ausgeführte Instanz einer Office-Anwendung?

    Verwenden Sie die GetActiveObject()-API. Automatisierungs-Server registrieren sich selbst in der ROT (Tabelle der ausgeführten Objekte), über die RegisterActiveObject()-API. Automatisierungsclients können an die ausgeführte Instanz durch Code 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 Ausführen der Office-Anwendung, die Sie anfügen möchten, Sie werden nur die erste Instanz an, die mit der GetActiveObject()-API gestartet wurde.

    Sie können theoretisch die ROT für jede einzelne Instanz durchlaufen, aber die Office-Anwendungen registrieren nicht selbst, wenn bereits eine andere Instanz ist in der ROT, da der Moniker für sich selbst immer gleich (es ist konnte nicht auf jeden Fall unterscheiden). Dies bedeutet, dass Sie eine Verbindung mit herstellen kann Jede Instanz mit Ausnahme der ersten. Aber da die Office-Anwendungen auch Ihre Dokumente in der ROT registrieren, können Sie erfolgreich an anfügen andere Instanzen von die Suche nach einem bestimmten Dokument ROT durchlaufen, Anfügen zu, und klicken Sie dann das Application-Objekt daraus abrufen. Es gibt Teile des Codes in der folgenden Microsoft Knowledge Base-Artikel für Durchlaufen der ROT und sucht nach einem Dokument:
    190985 So wird 's gemacht: IDispatch eines Excel oder Word-Dokument aus einer OCX abrufen
    Müssen keine dazu für PowerPoint, da es eine Single - ist Instanz-Anwendung; Sie können nur jeweils eine Instanz davon ausgeführt haben.
  6. Wie führen Sie die optionalen Parameter werden übergeben?

    Einige Methoden haben "optional" Parameter. In Visual Basic können Sie Lassen sie BEILÄUFIG beim Aufrufen der Methode. Jedoch beim Aufrufen von mit Visual C++, Sie haben einer besonderen Variante, deren Feld .vt übergeben, wird VT_ERROR und .scode Feld DISP_E_PARAMNOTFOUND. Das ist:
          // VARIANT used in place of optional-parameters.
          VARIANT varOpt;
          varOpt.vt = VT_ERROR;
          varOpt.scode = DISP_E_PARAMNOTFOUND;
    						
    Das ist wirklich ausgeführten Visual Basic hinter den Kulissen.
  7. Wie fangen ich Ereignisse, die von der Office-Anwendungen verfügbar gemacht werden?

    Im Allgemeinen implementieren Sie die Schnittstelle Sie abfangen möchten (die "Sink") und eine Advise-Verbindung mit der Anwendung (das setup "Quelle"). Im folgende Artikel gibt Ihnen detaillierte Beispiele für Microsoft Word:
    183599 So wird 's gemacht: Microsoft Word 97-Anwendungsereignisse mit VC++ Catch
    In der Regel erhalten die Advise-Verbindung einrichten, Sie des Servers IConnectionPointContainer und rufen Sie mit der IID der FindConnectionPoint() die Schnittstelle. Dies gibt Ihnen die IConnectionPoint-Schnittstelle und wird nur Advise() mit einer Instanz von Ihr Ereignis aufrufen -Schnittstelle. Der Server wird dann Aufruf zurück durch diese Schnittstelle beim Diese Ereignisse treten.
  8. Meine Automatisierungscode ist zu langsam. Wie kann ich Dinge beschleunigen?

    Eine häufige Ursache für Geschwindigkeitsprobleme mit der Automatisierung ist mit sich wiederholenden Lesen und Schreiben von Daten. Dies ist typisch für Excel-Automatisierung Clients. Allerdings nicht die meisten Leute Beachten Sie, dass diese Daten in der Regel schriftliche oder lesen Sie alle auf einmal mit SAFEARRAY. Finden Sie im folgende Microsoft Weitere Informationen und Beispiele für die informativen Knowledge Base-Artikeln:
    186120 So wird 's gemacht: Verwenden von MFC zum Automatisieren von Excel und Füllen eines Bereichs mit einem Array
    186122 So wird 's gemacht: Verwenden von MFC zum Automatisieren von Excel & erhalten ein Array aus einem Bereich
    179706 So wird 's gemacht: Verwenden von MFC zum Automatisieren von Excel und eine neue Arbeitsmappe erstellen bzw. Format
    Außerdem ist es wichtig, darauf hinweisen, dass mit Hilfe der Zwischenablage manchmal die verbessern Sie Leistung. Beispielsweise können Sie Ihre Daten zu kopieren. die Zwischenablage, und Verwenden von Automatisierung auf dem Server einfügen mitzuteilen. Oder umgekehrt ? umgekehrt; weist den Server an die Zwischenablage kopieren und Einfügen in Ihre die Anwendung.
  9. Was tun, dass diese großen Fehlerwerte, wie z. B.-2147352573 oder 0x80030002 bedeuten?

    Diese Werte werden als HRESULTs bezeichnet und in winerror.h definiert sind. Die Zahlen sind so groß, da das erste stellt-ob Bit es ist ein fehlerhaftes Ergebnis. Sie können das ErrLook.Exe-Dienstprogramm verwenden, die mit Visual C++ diese Zahlen in aussagekräftige Beschreibungen zu übersetzen.

    Wenn Sie eine Beschreibung für die Fehler programmgesteuert abrufen möchten Sie Sie können die FormatMessage()-API. Finden Sie unter der folgenden Microsoft Knowledge Weitere Informationen und Beispiele für die Verwendung der Knowledgebase-Artikel FormatMessage():
    186063 INFO: Übersetzen von Automatisierungsfehlern für VB/VBA
    122957 Beispiel: Decode32 und Decode16 OLE-Fehlercode Decoder Tools
    HINWEIS: Wenn Sie Visual C++ 6.0 verwenden und haben eine Variable mit diesem Wert im Debug-Überwachungsfenster, anhängen ", hr" (ohne Anführungszeichen), um Visual C++, die sie übersetzt haben!
  10. Was ist eine Typbibliothek?

    Eine Typbibliothek ähnelt einer C/C++-Headerdatei. Es enthält die Schnittstellen, Methoden und Eigenschaften, die eine Serververöffentlichung. Sie können die Typbibliothek mit den OLE/COM-Objektkatalog (Oleview.exe) anzeigen, im Lieferumfang von Visual C++. Hier ist eine Liste der Dateinamen Typ-Bibliothek für Microsoft Office, 95, 97 und 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. Meine Automatisierungscode arbeitete mit Excel 95 aber fehlschlägt, Excel 97. Was ist passiert?

    Excel-Objektmodell vorgenommen, eine wesentliche Änderung gegenüber Version 95 97 Excel 95 implementiert alle ihre Methoden und Eigenschaften in einem einzigen Implementierung von IDispatch. Dies bedeutete, dass oft Sie aufgerufen werden könnten Methoden für das Objekt X von Y-Objekt bestimmt. Dies war kein gutes Design, So ist in Office 97, jedes Objekt einen eigenen separaten Idispatch -Implementierung. Dies bedeutet, dass, wenn Sie eine Methode oder Eigenschaft von Fragen Objekt X von Y, über ein separates Objekt erhalten Sie die Fehlermeldung 0x80020003, -2147352573, "Element wurde nicht gefunden." Um diesen Fehler zu vermeiden, müssen Sie Sie sicher, dass die zugrunde liegende IDispatch-Schnittstelle, die Sie vornehmen von aufruft die semantisch korrekt ist. Finden Sie unter der folgenden Microsoft Knowledge Base-Artikel Weitere Informationen:
    172108 So wird 's gemacht: Problembehandlung bei "Member nicht gefunden", 0x80020003 Fehler
  2. Die Anwendung, die ich bin automatisieren bleibt im Speicher nach dem Programm ist abgeschlossen. Was ist passiert?

    Wahrscheinlich deshalb, weil Sie vergessen haben, lassen Sie das erworbene Schnittstelle, und Sie müssen es aufspüren. Hier sind einige allgemeine Vorschläge und Dinge, die zu überprüfenden:

    • Wenn die Verwendung von #import ist es sehr wahrscheinlich, dass Sie in einem der Verweiszählung Fehler zugeordnet werden konnte. Oft der Fehler können umgangen werden, aber in der Regel eine bevorzugte von den anderen Automatisierungsmethoden. #Import funktioniert nicht sehr gut. mit den Office-Anwendungen da die Typbibliotheken und verwenden sind ziemlich komplex. Darüber hinaus sind solche Verweis zählen Probleme schwer Aufspüren, da ein Großteil der Schnittstellenebene COM-Aufrufe sind hinter den Kulissen bei Verwendung von #import.
    • Überprüfen Sie, wenn Sie alle Methoden, z. B. Öffnen oder neu aufrufen, zurückgeben IDispatch * (LPDISPATCH) und die Rückgabe zu ignorieren. Wert. Wenn Sie sind, sind dann Sie diese zurückgegebenen Schnittstelle aufzugeben und müssen den Code ändern, so dass Sie es, wenn keine freigeben mehr benötigt.
    • Schrittweise kommentieren Sie die Abschnitte des Codes bis das problem verschwindet, und fügen Sie es wieder überlegt wo Aufspüren der Problem beginnt.
    • Beachten Sie, dass einige Anwendungen ausgeführt bleiben werden, wenn der Benutzer hat "die Anwendung berührt. Wenn dies auftritt, während Sie automatisieren möchten, dann wird die Anwendung wahrscheinlich bleiben danach ausgeführt. Die Office-Anwendungen verfügen über eine Eigenschaft "UserControl" auf die Anwendung Objekt, das Sie Lese-/Schreibzugriff können Sie dieses Verhalten ändern.
    • Auch werden einige Anwendungen ausgeführt, wenn genügend bleiben entscheiden. Benutzeroberfläche "Action" ist aufgetreten. Wenn Sie die Anwendung beenden, anschließend dessen Quit()-Methode aufrufen, über die Anwendung -Objekt. Word wird geschlossen, unabhängig von seinen Verweis gezählt, wenn Beenden aufgerufen wird. Dies ist nicht COM erwartet. Excel, jedoch ordnungsgemäß nur ausblenden, selbst aber bleiben, bis alle ausstehenden Schnittstellen werden freigegeben. Im Allgemeinen sollten Sie alle freigeben Ausstehende Verweise und Quit(), wenn Sie beabsichtigen nur Aufruf der die Anwendung zu beenden.
  3. Ich weiß, was ich als Benutzer ein Office-Anwendung tun möchten, aber wie mache ich dies programmgesteuert über die Automatisierung?

    Was Sie interessiert ist, welche Objekte, Methoden und Eigenschaften Sie benötigen. Der beste Weg um zu erfahren, wie die Objektmodelle von navigieren Wird von Word, Excel und Powerpoint, basierend auf was Sie als Benutzer tun möchten. die Makroaufzeichnung verwenden. Wählen Sie einfach die Macro\ 'Aufzeichnen' aus der Im Menü Extras, führen Sie die Aufgabe, die Sie interessiert sind, und wählen Sie Macro\ 'die Aufzeichnung beenden." Sobald Sie fertig sind aufzeichnen, wählen Sie Macro\Macros Wählen Sie im Menü Extras das Makro, das Sie aufgezeichnet haben, das Klicken Sie auf Bearbeiten. Dadurch gelangen Sie zu generierten VBA-Code ausführen, wird die Aufgabe, die Sie aufgezeichnet. Beachten Sie das aufgezeichnete Makro wird nicht optimal sind. Mögliche Code in den meisten Fällen, aber es ist sehr gut für eine schnelle Beispiel:.
  4. Kann ich eine eingebettete Office-Anwendung automatisieren?

    Absolut. Der Trick ist immer den IDispatch-Zeiger: Dies ist gemäß die Visual C++ ? Technischer Hinweis 39 (TN039). Finden Sie im folgende Microsoft Knowledge Base-Artikel für ein schrittweises Beispiel:
    184663 So wird 's gemacht: Einbetten und Automatisieren von Microsoft Excel-Arbeitsblatt mit MFC
  5. Wie kann ich meine Dokumenteigenschaften in ein Office-Dokument zugreifen?

    Die Dokumenteigenschaften durch Automatisierung zugegriffen werden oder direkt über IPropertyStorage. Jede Methode führen Sie die folgenden Artikeln der Microsoft Knowledge Base vor:
    179494 So wird 's gemacht: Verwenden der Automatisierung zum Abrufen von integrierten Dokumenteigenschaften
    186898 So wird 's gemacht: Lesen Sie Verbunddokument Eigenschaften direkt mit VC++-

Eigenschaften

Artikel-ID: 196776 - Geändert am: Dienstag, 30. Oktober 2012 - Version: 9.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Visual C++ 2008 Express Edition
  • Microsoft Project 2000 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Access 97 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft PowerPoint 97 Standard Edition
  • Microsoft Outlook 97 Standard Edition
  • Microsoft Word 97 Standard Edition
  • Microsoft Access 2000 Standard Edition
  • Microsoft PowerPoint 2000 Standard Edition
  • Microsoft Outlook 2000 Standard Edition
  • Microsoft Word 2000 Standard Edition
  • Microsoft Access 2002 Standard Edition
  • Microsoft Excel 2002 Standard Edition
  • Microsoft PowerPoint 2002 Standard Edition
  • Microsoft Word 2002 Standard Edition
  • Microsoft Outlook 2002 Standard Edition
Keywords: 
kbsweptvs2008 kbautomation kbmt KB196776 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 196776
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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