COM 객체에 인터페이스 또는 서비스를 질의합니다.
InterfacePointer := ComObjQuery(ComObject, SID, IID)
COM 포장 객체 또는 날 인터페이스 포인터.
인터페이스 식별자 (GUID). 형식 "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}".
서비스 식별자. IID와 형식이 값습니다. 이 매개변수가 생략되면, 쉼표도 생략됩니다.
그의 두-매개변수 모드에서, 이 함수는 IUnknown::QueryInterface와 동등합니다. SID와 IID 모두 지정되면, 내부적으로 IServiceProvider 인터페이스에 질의한 다음, IServiceProvider::QueryService를 호출합니다. 어느 경우든, 반환 값은 0 이거나 아니면 요청된 인터페이스를 가리키는 포인터입니다. 일반적으로 이 포인터는 반드시 스크립트가 일을 마칠 때 해제되어야 합니다.
obj := ComObjCreate("Scripting.Dictionary")
MsgBox % "Interface name: " ComObjType(obj, "name")
IID_IProvideClassInfo := "{B196B283-BAB4-101A-B69C-00AA00341D07}"
; 그 객체의 IProvideClassInfo 인터페이스를 가리키는 포인터를 요구합니다.
if !(pci := ComObjQuery(obj, IID_IProvideClassInfo))
{
MsgBox IProvideClassInfo interface not supported.
return
}
; GetClassInfo를 호출해 ITypeInfo 인터페이스를 가리키는 포인터를 열람합니다.
DllCall(vtable(pci, 3), "ptr", pci, "ptr*", ti)
; GetDocumentation을 호출하여 그 객체의 완전한 유형 이름을 얻습니다.
DllCall(vtable(ti, 12), "ptr", ti, "int", -1, "ptr*", pname, "ptr", 0, "ptr", 0, "ptr", 0)
; BSTR 포인터를 쓸모있는 문자열로 변환합니다.
name := StrGet(pname, "UTF-16")
; Free the BSTR referenced by pname.
DllCall("OleAut32\SysFreeString", "ptr", pname)
; 날 인터페이스 포인터들을 해제합니다.
ObjRelease(ti)
ObjRelease(pci)
; 유형 이름을 보여줍니다!
MsgBox % "Class name: " name
vtable(ptr, n) {
; NumGet(ptr+0)은 그 객체의 가상 함수 테이블의 (약자로 vtable)
; 주소를 돌려줍니다. 표현식의 나머지는 n번째 함수의 주소를
; vtable로부터 열람합니다.
return NumGet(NumGet(ptr+0), n*A_PtrSize)
}
sURL := "https://www.autohotkey.com/boards/"
if WebBrowser := GetWebBrowser()
WebBrowser.Navigate(sURL)
return
GetWebBrowser()
{
; 최상위 IE 창의 문서 객체를 가리키는 날 포인터를 얻습니다.
static msg := DllCall("RegisterWindowMessage", "Str", "WM_HTML_GETOBJECT")
SendMessage msg, 0, 0, Internet Explorer_Server1, ahk_class IEFrame
if (ErrorLevel = "FAIL")
return ; IE가 발견되지 않음.
lResult := ErrorLevel
DllCall("oleacc\ObjectFromLresult", "Ptr", lResult
, "Ptr", GUID(IID_IHTMLDocument2,"{332C4425-26CB-11D0-B483-00C04FD90119}")
, "Ptr", 0, "Ptr*", pdoc)
; WebBrowserApp 서비스에 질의합니다. 이 특별한 경우는
; SID와 IID가 같습니다. 그러나 언제나 이런 것은 아닙니다.
static IID_IWebBrowserApp := "{0002DF05-0000-0000-C000-000000000046}"
static SID_SWebBrowserApp := IID_IWebBrowserApp
pweb := ComObjQuery(pdoc, SID_SWebBrowserApp, IID_IWebBrowserApp)
; 문서 객체 포인터를 풀어줍니다.
ObjRelease(pdoc)
; WebBrowser 객체를, 사용을 위해 포장해서, 반환합니다:
static VT_DISPATCH := 9, F_OWNVALUE := 1
return ComObject(VT_DISPATCH, pweb, F_OWNVALUE)
}
GUID(ByRef GUID, sGUID) ; 문자열을 이진 GUID로 변환하고 그의 주소를 돌려줍니다.
{
VarSetCapacity(GUID, 16, 0)
return DllCall("ole32\CLSIDFromString", "WStr", sGUID, "Ptr", &GUID) >= 0 ? &GUID : ""
}