ComObjConnect

Verbindet die Ereignisquelle eines COM-Objekts mit dem Skript, um eine Behandlung von Ereignissen zu ermöglichen.

ComObjConnect ComObj , PräfixOderSink

Parameter

ComObj

Typ: ComObject

Ein Objekt, das Ereignisse auslöst.

Wenn das Objekt das IConnectionPointContainer-Interface nicht unterstützt oder wenn Typinformationen über die Klasse des Objekts nicht abgerufen werden können, wird eine Fehlermeldung angezeigt. Diese Fehlermeldung kann mit Try/Catch unterdrückt oder behandelt werden.

Das IProvideClassInfo-Interface wird verwendet, um Typinformationen über die Klasse des Objekts abzurufen, sofern es vom Objekt unterstützt wird. Andernfalls versucht ComObjConnect, die Typinformationen via IDispatch-Interface des Objekts abzurufen, was unzuverlässig sein kann.

PräfixOderSink

Typ: Zeichenkette oder Objekt

Wenn weggelassen, wird die Verbindung zum Objekt getrennt, d.h. das Skript erhält keine Benachrichtigungen von seinen Ereignissen mehr. Andernfalls geben Sie eine Zeichenkette an, die dem Ereignisnamen vorangestellt wird, um zu bestimmen, welche globale Funktion aufgerufen werden soll, wenn ein Ereignis stattfindet, oder ein Event-Sink-Objekt, das eine statische Methode für jedes zu behandelnde Ereignis definiert.

Hinweis: Verschachtelte Funktionen werden in diesem Modus nicht unterstützt, da Namen erst nach Rückkehr der aktuellen Funktion aufgelöst werden können. Um verschachtelte Funktionen oder Closures zu verwenden, binden Sie diese an ein Objekt und übergeben Sie das Objekt wie unten beschrieben.

Verwendung

Um ComObjConnect effektiv nutzen zu können, müssen Sie zunächst Funktionen in das Skript schreiben, die die entsprechenden Ereignisse behandeln können. Solche Funktionen, auch "Ereignishandler" genannt, haben die folgende Struktur:

PräfixEreignisName([Params..., ComObj])
{
    ... ereignisbehandelnder Code ...
    return RückgabeWert
}

Präfix sollte identisch mit dem PräfixOderSink-Parameter sein, wenn es eine Zeichenkette ist, andernfalls sollte es weggelassen werden. EreignisName sollte mit dem Namen des Ereignisses ersetzt werden, das von der Funktion behandelt werden soll.

Params entspricht den Parametern, die das Ereignis hat. Wenn das Ereignis keine Parameter hat, sollte Params ganz weggelassen werden. ComObj ist ein zusätzlicher Parameter, der eine Referenz zum ursprünglichen Wrapper-Objekt enthält, das an ComObjConnect übergeben wurde; dieser Parameter wird in der Dokumentation des COM-Ereignisses nie erwähnt. "ComObj" sollte mit einem Namen ersetzt werden, der besser zum Kontext Ihres Skripts passt.

Beachten Sie, dass Ereignishandler Rückgabewerte haben können. Mit ComValue kann ein COM-spezifischer Wertetyp zurückgegeben werden. Zum Beispiel gibt return ComValue(0,0) eine Variante des Typs VT_EMPTY zurück, was dasselbe ist wie, als würde eine JavaScript-Funktion undefined (oder gar nichts) zurückgeben.

Mit ComObjConnect(MeinObjekt, "Präfix") kann die Ereignisbehandlung aktiviert werden.

Rufen Sie ComObjConnect(MeinObjekt) auf, um die Verbindung zum Objekt zu trennen (Ereignisbehandlungen zu stoppen).

Wenn die Anzahl der Parameter unbekannt ist, kann eine variadische Funktion verwendet werden.

Event-Sink

Wenn PräfixOderSink ein Objekt ist, wird jedes Mal, wenn ein Ereignis ausgelöst wird, die entsprechende Methode dieses Objekts aufgerufen. Obwohl das Objekt dynamisch konstruiert werden kann, ist es für PräfixOderSink typischer, auf eine Klasse oder eine Instanz einer Klasse zu verweisen. In diesem Fall werden die Methoden wie oben definiert, jedoch ohne Präfix.

Wie bei jedem Methodenaufruf enthält der (normalerweise versteckte) this-Parameter der Methode eine Referenz zum Objekt, über das die Methode aufgerufen wurde; also das Event-Sink-Objekt, nicht das COM-Objekt. Dies kann verwendet werden, um den Ereignishandlern Kontext bereitzustellen oder um Werte zwischen ihnen auszutauschen.

Um alle Ereignisse abzufangen, ohne für jedes einzelne eine Methode zu definieren, definieren Sie eine __Call-Metafunktion.

ComObject gibt seine Referenz zu PräfixOderSink automatisch frei, wenn das COM-Objekt die Verbindung freigibt. Das passiert zum Beispiel, wenn der Internet Explorer beendet wird. Wenn das Skript seine eigene Referenz zu PräfixOderSink nicht beibehält, kann es __Delete verwenden, um zu erkennen, wann dies geschieht. Wenn das Objekt von einem Remote-Prozess gehostet wird und der Prozess unerwartet terminiert wird, kann es mehrere Minuten dauern, bis das System die Verbindung freigibt.

Bemerkungen

Das Skript muss eine Referenz zu ComObj behalten, andernfalls würde es automatisch freigegeben und die Verbindung zu seinem COM-Objekt trennen, was verhindert, dass weitere Ereignisse erkannt werden. Es gibt keine Standardmethode, um zu erkennen, wann die Verbindung nicht mehr benötigt wird, daher muss das Skript die Verbindung manuell trennen, indem es ComObjConnect aufruft.

Möglicherweise ist die Persistent-Funktion erforderlich, um das Skript am Laufen zu halten, während es auf Ereignisse wartet.

Bei Misserfolg wird eine Ausnahme ausgelöst.

ComObject, ComObjGet, ComObjActive, WScript.ConnectObject (Microsoft Docs)

Beispiele

Startet eine Instanz des Internet Explorers und verbindet Ereignisse mit entsprechenden Skriptfunktionen, die das Präfix "IE_" haben. Details zum hier verwendeten COM-Objekt und zum DocumentComplete-Ereignis finden Sie unter InternetExplorer object (Microsoft Docs).

ie := ComObject("InternetExplorer.Application")

; Verbindet Ereignisse mit entsprechenden Skriptfunktionen, die das Präfix "IE_" haben.
ComObjConnect(ie, "IE_")

ie.Visible := true  ; Funktioniert nicht korrekt unter IE7.
ie.Navigate("https://www.autohotkey.com/")
Persistent

IE_DocumentComplete(ieEventParam, &url, ieFinalParam) {
    ; IE übergibt url als Referenz, die auf ein VARIANT verweist,
    ; daher wird oben &url verwendet, damit der Code unten normal
    ; darauf verweisen kann, anstatt %url% zu nutzen.
    s := ""
    if (ie != ieEventParam)
        s .= "Erster Parameter ist ein neues Wrapper-Objekt.`n"
    if (ie == ieFinalParam)
        s .= "Letzter Parameter ist das originale Wrapper-Objekt.`n"
    if (ComObjValue(ieEventParam) == ComObjValue(ieFinalParam))
        s .= "Beide Wrapper-Objekte verweisen auf dieselbe IDispatch-Instanz.`n"
    MsgBox s . "Das Laden von " ie.Document.title " @ " url " wurde abgeschlossen."
    ie.Quit()
    ExitApp
}