Fragt ein COM-Objekt nach einem Interface oder Service ab.
InterfacePointer := ComObjQuery(ComObject, SID, IID) InterfacePointer := ComObjQuery(ComObject, IID)
Ein COM-Wrapper-Objekt oder roher Interface-Pointer.
Ein Interface-Identifikator (GUID) im Format "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}".
Ein Service-Identifikator im selben Format wie IID.
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.
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 : "" }