ComObjActive()

提供: AutoHotkey Wiki
移動: 案内検索

実行制御 | GUI表示 | 演算・変数 | メモリ・DLL操作 | 文字列操作 | キーボード | マウス | シェル | ウィンドウ | ウィンドウグループ
ステータスバー | コントロール | サウンド | ファイル | INIファイル | レジストリ | 環境変数 | AutoHotkey | その他 | 設定関係 | オブジェクト

ComObjActive() [AHK_L 53+][編集]

このページの訳はかなり怪しいです。あまり信用しないように。
AHKL OLEに登録されている実行中のオブジェクトを取得する。

ComObject := ComObjActive(CLSID)

対象となるオブジェクトの素の IDispatch ポインタをラップ・非ラップする。

ComObject := ComObjEnwrap(DispPtr)
DispPtr := ComObjUnwrap(ComObject)

パラメタまたは戻り値としてオブジェクトに引き渡す値をラップにする。

ParamObj := ComObjParameter(VarType, Value [, Flags])

COMオブジェクトのメソッド呼び出し時に、任意パラメタのデフォルト値として利用されるオブジェクトを生成する。

ParamObj := ComObjMissing()

Parameters[編集]

引数名 説明
CLSID 取得対象とするCOMオブジェクトの CLSID または可読な Prog IDを指定する。
ComObject オブジェクト文法で利用できるCOMオブジェクト。
DispPtr 素の IDispatch ポインタ。
VarType 値の型を示す整数値。型の一覧は VARIANT Type Constants (MSDN) を参照のこと。
Value ラップする値。今のところ整数とポインタのみをサポート。
Flags この関数とラッパーオブジェクトの挙動に関するフラグ。以下参照:
0 規定の挙動。 IUnknown およびIDispatch ポインタに対して AddRef が自動的に呼び出される。 従って呼び出し側は、必要に応じて ObjRelease() を用いてポインタのコピーを解放しなければならない。
1 IUnknown、IDispatch または SAFEARRAY ポインタに対して所有権を得る。
AddRef は呼び出さない。ラッパーオブジェクトが SAFEARRAY(VT_BYREFは除く)を格納している場合、オブジェクトの解放時には SafeArrayDestroy が自動的に呼び出される。

Remarks[編集]

ComObjActiveは様々な用途がある。ComObjActiveを除く"ComObj"を接頭辞とする全ての関数コールは実質的にはComObjActiveをコールしている。例を挙げると、 ComObj(9, DispPtr) および ComObjActive(DispPtr)ComObjEnwrap(DispPtr)と同じである。

この関数を IDispatchポインタをラップする用途で用いた場合、 AddRef を呼び出してCOMオブジェクトの参照カウンタを増加させる。ラッパーオブジェクトの最後の参照が解放された時には、IDispatchポインタの示すものをリリースする。スクリプトではオブジェクトの生存期間を制御するために ObjAddRed/ObjRelease を利用する事ができる。この件に関する詳細はReference Counting Rules (MSDN) を参照のこと。

既知の制限事項[編集]

COMオブジェクトがラップされる毎に、新たなラッパーオブジェクトが生成される。「obj1 == obj2」,「array[obj1] := value」のような比較・代入の場合、たとえ各々が同一のCOMオブジェクトを格納していたとしても、それぞれがユニークなラッパーオブジェクトとして扱われる。

General Remarks[編集]

ComObjCreate(), ComObjGet(), ComObjConnect(), ComObjError(), ObjAddRed/ObjRelease, GetActiveObject (MSDN)

Example(s)[編集]

ComObjUnwrap に関しては ComObjConnect を参照のこと。

; Example: Pass a VARIANT ByRef to a COM function.

code =
(
Sub Example(Var)
    MsgBox Var
    Var = "out value!"
End Sub
)
sc := ComObjCreate("ScriptControl"), sc.Language := "VBScript", sc.AddCode(code)

var := ComVar()
var[] := "in value"
sc.Run("Example", var.ref)
MsgBox % var[]

; ComVar: Creates an object which can be used to pass a value ByRef.
; ComVar[] retrieves the value.
; ComVar[] := Val sets the value.
; ComVar.ref retrieves a ByRef object for passing to a COM function.
ComVar()
{
    static base := Object("__Get","ComVarGet","__Set","ComVarSet","__Delete","ComVarDel")
    ; Create an array of 1 VARIANT.  This method allows built-in code to take
    ; care of all conversions between VARIANT and AutoHotkey internal types.
    arr := ComObjArray(0xC, 1)
    ; Lock the array and retrieve a pointer to the VARIANT.
    DllCall("oleaut32\SafeArrayAccessData", "ptr", ComObjValue(arr), "ptr*", arr_data)
    ; Store the array and an object which can be used to pass the VARIANT ByRef.
    Return Object("ref", ComObjParameter(0x400C, arr_data), "_", arr, "base", base)
}
ComVarGet(cv, p*) { ; Called when script accesses an unknown field.
    If p.MaxIndex() = "" ; No name/parameters, i.e. cv[]
        Return cv._[0]
}
ComVarSet(cv, v, p*) { ; Called when script sets an unknown field.
    If p.MaxIndex() = "" ; No name/parameters, i.e. cv[]:=v
        Return cv._[0] := v
}
ComVarDel(cv) { ; Called when the object is being freed.
    ; This must be done to allow the internal array to be freed.
    DllCall("oleaut32\SafeArrayUnaccessData", "ptr", ComObjValue(cv._))
}