ComObjQuery() [v1.0.96.00+]
COM 객체에 인터페이스나 서비스가 있는지 질의합니다.
InterfacePointer := ComObjQuery(ComObject, [SID,] IID)
매개변수
- ComObject
COM 포장 객체 또는 날 인터페이스 포인터.
- IID
인터페이스 식별자 (GUID). 형식 "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}".
- SID
서비스 식별자. IID와 형식이 값습니다. 이 매개변수가 생략되면, 쉼표도 생략됩니다.
총평
그의 두-매개변수 모드에서, 이 함수는 IUnknown::QueryInterface와 동등합니다. SID와 IID 모두 지정되면, 내부적으로 IServiceProvider 인터페이스에 질의한 다음, IServiceProvider::QueryService를 호출합니다. 어느 경우든, 반환 값은 0 이거나 아니면 요청된 인터페이스를 가리키는 포인터입니다. 일반적으로 이 포인터는 반드시 스크립트가 일을 마칠 때 해제되어야 합니다.
관련 항목
ObjRelease, ComObjCreate, ComObjGet, ComObjActive, ComObjError예제
; 예제: 객체의 클래스 이름을 알아냅니다 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*", name, "ptr", 0, "ptr", 0, "ptr", 0) ; BSTR 포인터를 쓸모있는 문자열로 변환합니다. name := StrGet(name, "UTF-16") ; 날 인터페이스 포인터들을 해제합니다. 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 := "http://ahkscript.org/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 : "" }