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 : ""
}