Fragt ein COM-Objekt nach einem Interface oder Service ab.
InterfaceComObj := ComObjQuery(ComObj, SID, IID) InterfaceComObj := ComObjQuery(ComObj, IID)
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.
Typ: Zeichenkette
Ein Interface-Identifikator (GUID) im Format "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}".
Typ: Zeichenkette
Ein Service-Identifikator im selben Format wie IID.
Typ: Objekt
Diese Funktion gibt ein COM-Wrapper-Objekt zurück, dessen Typ vom IID-Parameter abhängt.
IID | Klasse | Variantentyp | Beschreibung |
---|---|---|---|
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. |
Bei Misserfolg wird eine Ausnahme ausgelöst, z.B. wenn das Interface nicht unterstützt wird.
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
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 }