ComObjQuery

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

InterfaceComObj := ComObjQuery(ComObj, SID, IID)
InterfaceComObj := ComObjQuery(ComObj, IID)

Parameter

ComObj

Typ: Objekt oder Integer

Ein COM-Wrapper-Objekt, Interface-Pointer, oder ein Objekt mit einer Ptr-Eigenschaft, die einen Interface-Pointer zurückgibt. Weitere Informationen finden Sie unter ComValue.

IID

Typ: Zeichenkette

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

SID

Typ: Zeichenkette

Ein Service-Identifikator im selben Format wie IID.

Rückgabewert

Typ: Objekt

Diese Funktion gibt ein COM-Wrapper-Objekt zurück, dessen Typ vom IID-Parameter abhängt.

IIDKlasseVariantentypBeschreibung
IID_IDispatch ComObject VT_DISPATCH (9) Erlaubt dem Skript, Eigenschaften und Methoden des Objekts mit normaler Objektsyntax aufzurufen.
Andere IID ComValue VT_UNKNOWN (13) Stellt nur eine Ptr-Eigenschaft bereit, mit der das Objekt an DllCall oder ComCall übergeben werden kann.

Fehlerbehandlung

Bei Misserfolg wird eine Ausnahme ausgelöst, z.B. wenn das Interface nicht unterstützt wird.

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.

ComCall kann verwendet werden, um native Interface-Methoden aufzurufen.

ComCall, ComObject, ComObjGet, ComObjActive

Beispiele

Ermittelt den Klassennamen eines Objekts.

obj := ComObject("Scripting.Dictionary")

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

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

; IProvideClassInfo-Interface des Objekts anfordern.
try
    pci := ComObjQuery(obj, IID_IProvideClassInfo)
catch
{
    MsgBox "IProvideClassInfo-Interface wird nicht unterstützt."
    return
}

; GetClassInfo aufrufen, um einen Pointer zu erhalten, der auf das ITypeInfo-Interface verweist.
ComCall(3, pci, "ptr*", &ti := 0)

; ti wrappen, um automatische Säuberung zu ermöglichen.
ti := ComValue(13, ti)

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

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

; Säuberung.
DllCall("oleaut32\SysFreeString", "ptr", pname)
pci := ti := ""

; Den Typnamen anzeigen!
MsgBox "Klassenname: " name

Automatisiert ein vorhandenes Internet-Explorer-Fenster.

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

GetWebBrowser()
{
    ; Einen rohen Pointer abrufen, der auf das Document-Objekt des obersten IE-Fensters verweist.
    static msg := DllCall("RegisterWindowMessage", "Str", "WM_HTML_GETOBJECT")
    lResult := SendMessage(msg, 0, 0, "Internet Explorer_Server1", "ahk_class IEFrame")
    if !lResult
        return  ; IE nicht gefunden.
    static IID_IHTMLDocument2 := GUID("{332C4425-26CB-11D0-B483-00C04FD90119}")
    static VT_UNKNOWN := 13
    DllCall("oleacc\ObjectFromLresult", "Ptr", lResult
        , "Ptr", IID_IHTMLDocument2, "Ptr", 0
        , "Ptr*", pdoc := ComValue(VT_UNKNOWN, 0))
    
    ; 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)
    
    ; WebBrowser-Objekt als IDispatch in verwendbarer Form zurückgeben:
    ; Dies funktioniert nur, da IWebBrowserApp von IDispatch abgeleitet ist.
    ; pweb wird seinen ptr automatisch freigeben, daher AddRef verwenden.
    ObjAddRef(pweb.ptr)
    static VT_DISPATCH := 9
    return ComValue(VT_DISPATCH, pweb.ptr)
}

GUID(sGUID) ; Wandelt eine Zeichenkette in eine binäre GUID um und gibt sie in einem Buffer zurück.
{
    GUID := Buffer(16, 0)
    if DllCall("ole32\CLSIDFromString", "WStr", sGUID, "Ptr", GUID) < 0
        throw ValueError("Ungültiger Parameter #1", -1, sGUID)
    return GUID
}