Das Verhalten von "GetObject" und "CreateObject" bei Office-Automatisierungsservern

Dieser Artikel ist eine Übersetzung des folgenden englischsprachigen Artikels der Microsoft Knowledge Base:
288902 GetObject and CreateObject behavior of Office automation servers

Zusammenfassung

In diesem Artikel wird das unterschiedliche Verhalten der Funktionen GetObject und CreateObject in verschiedenen Versionen von Microsoft Office-Anwendungen behandelt. GetObject und CreateObject sind von Microsoft Visual Basic und Microsoft Visual Basic für Applikationen (VBA) bereitgestellte Funktionen. Die Informationen sind jedoch auch auf Microsoft Visual C++ anwendbar, wenn Sie Verweise auf GetObject wie Aufrufe zu der GetActiveObject-API und Verweise auf CreateObject wie Aufrufe zu der CoCreateInstance-API behandeln.

Weitere Informationen

GetObject

GetObject wird zum Herstellen einer Verbindung zu einer laufenden Instanz eines Automatisierungsservers verwendet. Es gibt einige verschiedene Möglichkeiten die Funktion GetObject aufzurufen, aber für die Microsoft Office-Anwendungen wird folgende Syntax empfohlen:
set xlApp = GetObject(, "Excel.Application")

Falls eine Instanz von Microsoft Excel und gleichzeitig dieser Code ausgeführt wird, können Sie mithilfe der Variablen "xlApp" auf das laufende Instanzobjektmodell zugreifen. Falls keine Instanz ausgeführt wird, tritt der folgende auffangbare Laufzeitfehler auf:
Laufzeitfehler '429':
Objekterstellung durch ActiveX-Komponente nicht möglich
Falls mehrere Instanzen von Microsoft Excel ausgeführt werden, stellt GetObject eine Verbindung zu der zuerst gestarteten Instanz her. Wenn Sie dann die erste Instanz schließen, wird durch einen weiteren Aufruf von GetObject eine Verbindung zu der zweiten gestarteten Instanz hergestellt und so weiter.

Sie können die Verbindung zu einer bestimmten Instanz herstellen, wenn Sie den Namen eines geöffneten Dokuments in der Instanz kennen. Wenn zum Beispiel eine Instanz von Excel ausgeführt wird, in der eine Arbeitsmappe mit dem Namen "Book2" geöffnet ist, wird mithilfe des folgenden Codes selbst dann erfolgreich eine Verbindung zu dieser Instanz hergestellt, wenn sie nicht zuerst geöffnet wurde:
Set xlApp = GetObject("Book2").Application

CreateObject

CreateObject wird zum Starten einer neuen Instanz eines Automatisierungsservers verwendet. Beispiel:
set xlApp = CreateObject("Excel.Application")

Abhängig davon, ob der Server als "SingleUse" oder "MultiUse" (Einzel- oder Mehrfachinstanz) ausgelegt ist, wird entweder ein weiterer Serverprozess gestartet oder nicht. Dieses Kriterium könnte für die Entscheidung auschlaggebend sein, das Herunterfahren einer Automatisierungsinstanz zu erzwingen. Eine Instanz eines MultiUse-Servers wird zum Beispiel bereits vor dem Herstellen einer Verbindung ausgeführt, und Sie möchten das programmgesteuerte Herunterfahren des Servers nach der Automatisierung vermeiden.

In der folgenden Tabelle finden Sie nützliche Informationen zum Implementieren einer Microsoft Office-Lösung. Die Informationen beziehen sich auf das Verhalten und die Attribute der verschiedenen Microsoft Office-Versionen und -Anwendungen. Sie können der Tabelle zum Beispiel entnehmen, ob die Standardeinstellung für den Server beim ersten Starten auf "Sichtbar" gesetzt ist, ob es sich um einen SingleUse- oder einen MultiUse-Server handelt, ob der Server die Eigenschaft "UserControl" besitzt und ob er eine Quit-Methode ausführen kann. Darüber hinaus wird der Klassenname für das Serverhauptfenster genannt.

Anwendung(en)SichtbarInstanzBenutzersteuerungBeendenKlassenname
Excel 97, 2000, 2002, 2003, 2007NeinSingleUseJaJaXlMain
Word 97, 2000, 2002, 2003, 2007NeinSingleUseJaJaOpusApp
PowerPoint 97NeinMultiUseNeinJaPP97FrameClass
PowerPoint 2000NeinMultiUseNeinJaPP9FrameClass
PowerPoint 2002NeinMultiUseNeinJaPP10FrameClass
PowerPoint 2003NeinMultiUseNeinJaPP11FrameClass
PowerPoint 2007NeinMultiUseNeinJaPP12FrameClass
Access 97JaSingleUseJaJaOMain
Access 2000, 2002, 2003, 2007NeinSingleUseJaJaOMain
Project 98, 2000NeinMultiUseJaJaJWinproj-WhimperMainClass

Der Klassenname des Hauptfensters ist hilfreich, wenn Sie die FindWindow-API aufrufen, um auf einfache Art und Weise zu ermitteln, ob eine bestimmte Instanz bereits ausgeführt wird. "UserControl" ist eine boolesche Eigenschaft, die anzeigt, ob die Serveranwendung automatisch heruntergefahren wird, wenn der letzte Verweis freigegeben wird (auf nichts gesetzt wird). Falls erforderlich kann die Benutzersteuerung (UserControl) mit der Quit-Methode außer Kraft gesetzt werden (zum Beispiel wenn eine Instanz nach der Freigabe des letzten Verweises nicht heruntergefahren wird).

Microsoft empfiehlt in den meisten Fällen eine neue Instanz einer Office-Anwendung zu verwenden, anstatt eine Verbindung zu einer Instanz herzustellen, die der Benutzer möglicherweise benutzt. Es wird empfohlen, mithilfe der Application ProgID eine Instanz zu erstellen und von dort aus anschließend neue Objekte zu öffnen und zu erstellen. Andere ProgIDs wie beispielsweise Excel.Sheet und Word.Document usw. sind für OLE (Object linking and Embedding) ausgelegt und können zu uneinheitlichen Ergebnissen führen, wenn Sie in Verbindung mit CreateObject verwendet werden. Mithilfe der Application ProgID können Sie vermeiden, dass Probleme auftreten, wenn Sie den Server explizit mit Automatisierung (und nicht mit Einbettung) starten.

Wenn Sie alle Schritte für den Automatisierungsserver durchgeführt haben, geben Sie alle betreffenden Verweise frei, und rufen Sie die Quit-Methode auf (falls verfügbar), sodass der Server wie erwartet heruntergefahren wird. Wenn Sie eine Instanz mit Automatisierung konfigurieren und diese dann für den Benutzer zur Verwendung freigeben möchten, müssen Sie die Eigenschaft "UserControl" auf TRUE setzen und anschließend alle Verweise freigeben. Der Server wird dann weiter ausgeführt (da die Eigenschaft "UserControl" auf TRUE gesetzt ist) und wird korrekt heruntergefahren, wenn der Benutzer die Anwendung schließt (da es keine ausstehenden Verweise gibt).

Hinweis: Für Word ist die Eigenschaft "UserControl" schreibgeschützt. Sie kann nicht auf "True" (Wahr) oder "False" (Falsch) gesetzt werden. Word wird weiterhin ausgeführt, wenn der letzte Verweis freigegeben wird.

Informationsquellen

Weitere Informationen zur Verwendung von "GetObject/CreateObject" sowie zu einigen Ausnahmen und Problemen im Zusammenhang mit der Automatisierung in Microsoft Office, finden Sie in den folgenden Artikeln der Microsoft Knowledge Base:

222783 CreateObject erstellt neue PowerPoint-Sitzung nicht
188546 BUG: manuell das Starten von Word verwendet dieselbe Instanz wie Automatisierung
265385 INFO: Automatisierung von PowerPoint 97 und PowerPoint 2000 Viewers
259940 BUG: Word 2000 Does Not Quit After Keybindings.ClearAll wird Aufgerufen
258511 Wie Erhalten des Fensterhandle für einen Office-Automatisierungsserver
249169 PPT97: PowerPoint 97 Remains in Arbeitsspeicher nach dem Abrufen einer Präsentation und geschlossen
159922 XL97: beendete die Verwendung Methode ungültige Operation verursachen kann
Bitte beachten Sie: Bei diesem Artikel handelt es sich um eine Übersetzung aus dem Englischen. Es ist möglich, dass nachträgliche Änderungen bzw. Ergänzungen im englischen Originalartikel in dieser Übersetzung nicht berücksichtigt sind. Die in diesem Artikel enthaltenen Informationen basieren auf der/den englischsprachigen Produktversion(en). Die Richtigkeit dieser Informationen in Zusammenhang mit anderssprachigen Produktversionen wurde im Rahmen dieser Übersetzung nicht getestet. Microsoft stellt diese Informationen ohne Gewähr für Richtigkeit bzw. Funktionalität zur Verfügung und übernimmt auch keine Gewährleistung bezüglich der Vollständigkeit oder Richtigkeit der Übersetzung.
Eigenschaften

Artikelnummer: 288902 – Letzte Überarbeitung: 30.10.2008 – Revision: 1

Feedback