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