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