ComObjConnect() [AHK_L 53+]

Verbindet die Ereignisquellen eines COM-Objekts mit Funktionen, die ein bestimmtes Präfix haben.

ComObjConnect(ComObject , Präfix)

Parameter

ComObject

Ein Objekt, das Ereignisse auslöst.

Wenn das Objekt das IConnectionPointContainer-Interface nicht unterstützt oder wenn die Typinformationen zur Klasse des Objekts nicht abgerufen werden kann, wird eine Fehlermeldung angezeigt. Mit ComObjError() oder Try/Catch kann dies unterdrückt oder kontrolliert werden.

[v1.1.22+]: Das IProvideClassInfo-Interface wird genutzt, um die Typinformationen zur Klasse des Objekts abzurufen, sofern es vom Objekt unterstützt wird. Ansonsten versucht ComObjConnect, die Typinformationen via IDispatch-Interface des Objekts abzurufen, was unzuverlässig sein kann.

Präfix

Eine Zeichenkette, die dem Ereignisnamen vorangestellt wird, um zu bestimmen, welche Funktion aufgerufen werden soll, wenn ein Ereignis stattfindet.

Lässt man diesen Parameter weg, wird die Verbindung zu diesem Objekt getrennt; das heißt, dass das Skript nicht länger Benachrichtigungen von seinen Ereignissen erhält.

[v1.1.01+]: Dieser Parameter kann ein via Skript definiertes Objekt sein. Wenn ein Ereignis ausgelöst wird, wird die entsprechende Methode aufgerufen. Der erste Parameter, der üblicherweise der versteckte this-Parameter ist, verweist auf das via Skript definierte Objekt, nicht auf das COM-Objekt. Mit einer __Call-Metafunktion können alle Ereignisse abgefangen werden, ohne dass für jedes Ereignis eine Methode definiert werden muss.

Verwendung

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

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

Für Präfix kann ein beliebiges Präfix angegeben werden, während der Ereignisname der Name des Ereignisses ist, 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. ComObject ist optional und kann nur genutzt werden, wenn die korrekte Anzahl von Params definiert ist; es enthält eine Referenz zum originalen Wrapper-Objekt, das an ComObjConnect übergeben wurde. "ComObject" sollte mit einem Namen ersetzt werden, der eher dem Kontext Ihres Skripts entspricht.

Beachten Sie, dass Eventhandler Rückgabewerte haben können. Mit ComObject(Typ, Wert) kann ein COM-spezifischer Wertetyp zurückgegeben werden. return ComObject(0,0) beispielsweise gibt eine Variante des Typs VT_EMPTY zurück, was das gleiche ist wie, als würde eine JavaScript-Funktion undefined (oder überhaupt nichts) zurückgeben.

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

Mit ComObjConnect(MeinObjekt) kann die Verbindung zum Objekt getrennt werden (um die Ereignisbehandlung zu stoppen).

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

Bemerkungen

Das Skript muss eine Referenz zu ComObject behalten, da ComObject sonst automatisch freigegeben und von dessen COM-Objekt getrennt werden würde, wodurch die Erkennung weiterer Ereignisse verhindert wird. Es gibt keine Standardmethode, um zu erkennen, wann die Verbindung überflüssig ist, daher muss das Skript die Verbindung manuell trennen, indem es ComObjConnect aufruft.

Die #Persistent-Direktive ist eventuell vonnöten, um das Skript am Laufen zu halten, während es auf Ereignisse wartet.

Bei Misserfolg wird die Funktion je nach aktueller ComObjError()-Einstellung und anderen Faktoren eventuell eine Ausnahme auslösen, das Skript beenden oder einfach ihren Wert zurückgeben.

ComObjCreate(), ComObjGet(), ComObjActive(), ComObjError(), WScript.ConnectObject (MSDN)

Beispiele

Startet eine Instanz des Internet Explorers und verbindet Ereignisse mit entsprechenden Skript-Funktionen, die das Präfix "IE_" haben. Einzelheiten über das hier verwendete COM-Objekt und DocumentComplete-Ereignis finden Sie unter InternetExplorer object (Microsoft Docs).

ie := ComObjCreate("InternetExplorer.Application")

; Verbindet Ereignisse mit entsprechenden Skript-Funktionen, 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) {
    global ie
    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 ((disp1:=ComObjUnwrap(ieEventParam)) == (disp2:=ComObjUnwrap(ieFinalParam)))
        s .= "Beide Wrapper-Objekte verweisen auf die gleiche IDispatch-Instanz.`n"
    ObjRelease(disp1), ObjRelease(disp2)
    MsgBox % s . "Das Laden von " ie.Document.title " @ " url " wurde abgeschlossen."
    ie.Quit()
    ExitApp
}