ComObjQuery

COMオブジェクトにインターフェースやサービスを問い合わせる。

InterfaceComObj := ComObjQuery(ComObj, SID, IID)
InterfaceComObj := ComObjQuery(ComObj, IID)

パラメータ

ComObj

型:オブジェクトまたは整数

COM ラッパーオブジェクト、インターフェースポインタ、またはインターフェースポインタを返すPtrプロパティを持つオブジェクト。See ComValue for details.

IID

型:文字列

インターフェース識別子(GUID)。"{xxxxxxx-xxxx-xxxx-xxxx-xxxx}"の形式をとる。

SID

型:文字列

IIDと同形式のサービス識別子。

戻り値

型:Object

この関数は、IIDパラメータに依存するタイプのCOMラッパーオブジェクトを返します。

IIDClassVariant Type説明
IID_IDispatch ComObject VT_DISPATCH (9) 通常のオブジェクトの構文を使用して、スクリプトがオブジェクトのプロパティやメソッドを呼び出せるようにします。
その他のIID ComValue VT_UNKNOWN (13) Ptrプロパティのみを提供し、DllCallまたはComCallにオブジェクトを渡すことができます。

エラー処理

インターフェースがサポートされていない場合など、失敗した場合は例外が発生します。

備考

2パラメータモードでは、この関数はIUnknown::QueryInterfaceと同等です。SID と IID の両方が指定された場合、内部でIServiceProviderインターフェースの問い合わせを行い、IServiceProvider::QueryServiceを呼び出します。

ComCallは、ネイティブインターフェースのメソッドを呼び出すために使用することができます。

ComCall, ComObject, ComObjGet, ComObjActive

オブジェクトのクラス名を決定します。

obj := ComObject("Scripting.Dictionary")

MsgBox "Interface name:" ComObjType(obj, "name")

IID_IProvideClassInfo := "{B196B283-BAB4-101A-B69C-00AA00341D07}"

;オブジェクトの IProvideClassInfo インタフェースを要求します。
try
    pci := ComObjQuery(obj, IID_IProvideClassInfo)
catch
{
    MsgBox "IProvideClassInfo interface not supported."
    return
}

;GetClassInfo を呼び出し、ITypeInfo インターフェースへのポインタを取得します。
ComCall(3, pci, "ptr*", &ti := 0)

; 自動洗浄を確実にするために、Wrap tiを使用します。
ti := ComValue(13, ti)

;オブジェクトの完全な型名を得るためにGetDocumentationを呼び出す。
ComCall(12, ti, "int", -1, "ptr*", &pname := 0, "ptr", 0, "ptr", 0, "ptr", 0)

; BSTRポインタを使用可能な文字列に変換します。
name := StrGet(pname, "UTF-16")

;クリーンアップ
DllCall("oleaut32\SysFreeString", "ptr", pname)
pci := ti := ""

; 型名を表示する!
MsgBox "Class name:" name

既存のInternet Explorerのウィンドウを自動化します。

sURL := "https://www.autohotkey.com/boards/"
if WebBrowser := GetWebBrowser()
    WebBrowser.Navigate(sURL)

GetWebBrowser()
{
    ;最上位のIEウィンドウのドキュメントオブジェクトへの生ポインタを取得します。
    static msg := DllCall("RegisterWindowMessage", "Str", "WM_HTML_GETOBJECT")
    lResult := SendMessage(msg, 0, 0, "Internet Explorer_Server1", "ahk_class IEFrame")
    if !lResult
        return  ; IEが見つかりません。
    static IID_IHTMLDocument2 := GUID("{332C4425-26CB-11D0-B483-00C04FD90119}")
    static VT_UNKNOWN := 13
    DllCall("oleacc\ObjectFromLresult", "Ptr", lResult
        , "Ptr", IID_IHTMLDocument2, "Ptr", 0
        , "Ptr*", pdoc := ComValue(VT_UNKNOWN, 0))
    
; WebBrowserApp サービスの ;クエリです。この特殊なケースで
    ; SIDとIIDは同じですが、いつもこうとは限りません。
    static IID_IWebBrowserApp := "{0002DF05-0000-0000-C000-000000000046}"
    static SID_SWebBrowserApp := IID_IWebBrowserApp
    pweb := ComObjQuery(pdoc, SID_SWebBrowserApp, IID_IWebBrowserApp)
    
; WebBrowserオブジェクトをIDispatchとして返し、使い勝手を良くします。
; これは、IWebBrowserAppがIDispatchから派生したものであるためです。
; pwebは自動的にptrを解放するので、それに対抗するためにAddRefします。
    ObjAddRef(pweb.ptr)
    static VT_DISPATCH := 9
    return ComValue(VT_DISPATCH, pweb.ptr)
}

GUID(sGUID) ; 文字列をバイナリGUIDに変換し、Bufferで返す。
{
    GUID := Buffer(16, 0)
    if DllCall("ole32\CLSIDFromString", "WStr", sGUID, "Ptr", GUID) < 0
        throw ValueError("Invalid parameter #1", -1, sGUID)
    return GUID
}