COMオブジェクトにインターフェースやサービスを問い合わせる。
InterfaceComObj := ComObjQuery(ComObj, SID, IID) InterfaceComObj := ComObjQuery(ComObj, IID)
COM ラッパーオブジェクト、インターフェースポインタ、またはインターフェースポインタを返すPtrプロパティを持つオブジェクト。詳しくはComValueをご覧ください。
型:文字列
インターフェース識別子(GUID)。「{xxxxxxx-xxxx-xxxx-xxxx-xxxx}」の形式をとる。
型:文字列
IIDと同形式のサービス識別子。
型:オブジェクト
この関数は、IIDパラメータに依存するタイプのCOMラッパーオブジェクトを返します。
| IID | クラス | バリアント型 | 説明 |
|---|---|---|---|
| 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
}