ComObjQuery() [v1.0.96.00+]

Fragt ein COM-Objekt nach einem Interface oder Service ab.

InterfacePointer := ComObjQuery(ComObject, SID, IID)
InterfacePointer := ComObjQuery(ComObject, IID)

Parameter

ComObject

Ein COM-Wrapper-Objekt oder roher Interface-Pointer.

IID

Ein Interface-Identifikator (GUID) im Format "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}".

SID

Ein Service-Identifikator im selben Format wie IID.

Allgemeine Bemerkungen

Im Zwei-Parameter-Modus ist diese Funktion äquivalent zu IUnknown::QueryInterface. Sind sowohl SID als auch IID angegeben, fragt die Funktion intern nach dem IServiceProvider-Interface ab und ruft anschließend IServiceProvider::QueryService auf. In beiden Fällen ist der Rückgabewert entweder 0 oder ein Pointer, der auf das angeforderte Interface verweist. Grundsätzlich muss dieser Pointer freigegeben werden, wenn er vom Skript nicht länger benötigt wird.

ObjRelease(), ComObjCreate(), ComObjGet(), ComObjActive(), ComObjError()

Beispiele

Ermittelt den Klassennamen eines Objekts.

obj := ComObjCreate("Scripting.Dictionary")

MsgBox % "Interface-Name: " ComObjType(obj, "name")

IID_IProvideClassInfo := "{B196B283-BAB4-101A-B69C-00AA00341D07}"

; Einen Pointer anfordern, der auf das IProvideClassInfo-Interface des Objekts verweist.
if !(pci := ComObjQuery(obj, IID_IProvideClassInfo))
{
    MsgBox IProvideClassInfo-Interface wird nicht unterstützt.
    return
}

; GetClassInfo aufrufen, um einen Pointer zu erhalten, der auf das ITypeInfo-Interface verweist.
DllCall(vtable(pci, 3), "ptr", pci, "ptr*", ti)

; GetDocumentation aufrufen, um den vollständigen Typnamen des Objekts zu erhalten.
DllCall(vtable(ti, 12), "ptr", ti, "int", -1, "ptr*", pname, "ptr", 0, "ptr", 0, "ptr", 0)

; Den BSTR-Pointer in eine brauchbare Zeichenkette umwandeln.
name := StrGet(pname, "UTF-16")

; Gibt den von pname referenzierten BSTR frei.
DllCall("OleAut32\SysFreeString", "ptr", pname)

; Rohe Interface-Pointer freigeben.
ObjRelease(ti)
ObjRelease(pci)

; Den Typnamen anzeigen!
MsgBox % "Klassenname: " name

vtable(ptr, n) {
    ; NumGet(ptr+0) gibt die Adresse der virtuellen Funktionstabelle
    ; des Objekts (kurz: vtable) zurück. Der Rest des Ausdrucks ruft
    ; die Adresse der n-ten Funktionsadresse aus der vtable ab.
    return NumGet(NumGet(ptr+0), n*A_PtrSize)
}

Automatisiert ein vorhandenes Internet-Explorer-Fenster.

sURL := "https://www.autohotkey.com/boards/"
if WebBrowser := GetWebBrowser()
    WebBrowser.Navigate(sURL)
return

GetWebBrowser()
{
    ; Einen rohen Pointer abrufen, der auf das Document-Objekt des obersten IE-Fensters verweist.
    static msg := DllCall("RegisterWindowMessage", "Str", "WM_HTML_GETOBJECT")
    SendMessage msg, 0, 0, Internet Explorer_Server1, ahk_class IEFrame
    if (ErrorLevel = "FAIL")
        return  ; IE nicht gefunden.
    lResult := ErrorLevel
    DllCall("oleacc\ObjectFromLresult", "Ptr", lResult
        , "Ptr", GUID(IID_IHTMLDocument2,"{332C4425-26CB-11D0-B483-00C04FD90119}")
        , "Ptr", 0, "Ptr*", pdoc)
    
    ; WebBrowserApp-Service anfordern. In diesem bestimmten Fall sind
    ; SID und IID identisch, was nicht immer der Fall ist.
    static IID_IWebBrowserApp := "{0002DF05-0000-0000-C000-000000000046}"
    static SID_SWebBrowserApp := IID_IWebBrowserApp
    pweb := ComObjQuery(pdoc, SID_SWebBrowserApp, IID_IWebBrowserApp)
    
    ; Document-Objektpointer freigeben.
    ObjRelease(pdoc)
    
    ; WebBrowser-Objekt in verwendbarer Form zurückgeben:
    static VT_DISPATCH := 9, F_OWNVALUE := 1
    return ComObject(VT_DISPATCH, pweb, F_OWNVALUE)
}

GUID(ByRef GUID, sGUID) ; Wandelt eine Zeichenkette in eine binäre GUID um und gibt deren Adresse zurück.
{
    VarSetCapacity(GUID, 16, 0)
    return DllCall("ole32\CLSIDFromString", "WStr", sGUID, "Ptr", &GUID) >= 0 ? &GUID : ""
}