ComObjQuery() [v1.0.96.00+]

Fordert ein Interface oder Service eines COM-Objekts an.

InterfacePointer := ComObjQuery(ComObject, SID, 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. Lässt man diesen Parameter weg, muss auch das Komma weggelassen werden.

Allgemeine Bemerkungen

Im Zwei-Parameter-Modus ist diese Funktion äquivalent zu IUnknown::QueryInterface. Sind sowohl SID als auch IID angegeben, wird intern das IServiceProvider-Interface angefordert und danach IServiceProvider::QueryService aufgerufen. 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 Typennamen 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 Typennamen 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 so ist.
    static IID_IWebBrowserApp := "{0002DF05-0000-0000-C000-000000000046}"
    static SID_SWebBrowserApp := IID_IWebBrowserApp
    pweb := ComObjQuery(pdoc, SID_SWebBrowserApp, IID_IWebBrowserApp)
    
    ; Document-Objekt-Pointer 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 ihre Adresse zurück.
{
    VarSetCapacity(GUID, 16, 0)
    return DllCall("ole32\CLSIDFromString", "WStr", sGUID, "Ptr", &GUID) >= 0 ? &GUID : ""
}