ComObjArray

COM で使用する SafeArray を作成します。

ArrayObj := ComObjArray(VarType, Count1 , Count2, ... Count8)

ComObjArray自体はComValueから派生したクラスですが、SafeArrayのラッパーオブジェクトを作成または識別するためにのみ使用されます。

パラメータ

VarType

型:整数

配列の基本型(配列の各要素のVARTYPE)。VARTYPEは、バリアントタイプのサブセットに限定されます。VT_ARRAYフラグ、VT_BYREFフラグのいずれも設定できない。VT_EMPTY と VT_NULL は、配列のベースタイプとして有効ではありません。それ以外のタイプはすべて合法です。

取り得る値の一覧は、ComObjTypeをご覧ください。

CountN

型:整数

各寸法の大きさです。最大8次元までの配列に対応しています。

戻り値

型:ComObjArray

この関数は、新しい SafeArray を含むラッパーオブジェクトを返します。

メソッド

ComObjArray オブジェクトは、以下のメソッドをサポートしています:

備考

ComObjArrayオブジェクトは、COMメソッドやComValueによって返されることもある。スクリプトは、以下のように値がComObjArrayであるかどうかを判断することができる:

; チェッククラス
if obj is ComObjArray
    MsgBox "Array subtype: " . ComObjType(obj) & 0xfff
else
    MsgBox "Not an array."

; VT_ARRAYのチェック
if ComObjType(obj) & 0x2000
    MsgBox "obj is a ComObjArray"

; 特定の配列の種類をチェックする
if ComObjType(obj) = 0x2008
    MsgBox "obj is a ComObjArray of strings"

最大8次元までの配列に対応しています。

SafeArrayは複数参照に対応していないため、あるSafeArrayを別のSafeArrayの要素に割り当てると、別のコピーが作成されます。ただし、これはラッパーオブジェクトがF_OWNVALUEフラグを持ち、そのフラグが配列を破壊する責任があることを示している場合にのみ発生します。このフラグは、ComObjFlagsを使用することで削除することができます。

COMクライアントから呼び出された関数やメソッドがF_OWNVALUEフラグを持つSafeArrayを返す場合、元のSafeArrayは自動的に破棄されるため、代わりにコピーが作成されて返されます。

ComValueComObjTypeComObjValueComObjActiveComObjFlagsArray Manipulation Functions (Microsoft Docs)

シンプルな使い方です。

arr := ComObjArray(VT_VARIANT:=12, 3)
arr[0] := "Auto"
arr[1] := "Hot"
arr[2] := "key"
t := ""
Loop arr.MaxIndex() + 1
    t .= arr[A_Index-1]
MsgBox t

多次元です。

arr := ComObjArray(VT_VARIANT:=12, 3, 4)

; 次元数を取得します:
dim := DllCall("oleaut32\SafeArrayGetDim", "ptr", ComObjValue(arr))

; 各次元の境界を取得します:
dims := ""
Loop dim
    dims .= arr.MinIndex(A_Index) " .. " arr.MaxIndex(A_Index) "`n"
MsgBox dims

; シンプルな使い方です:
Loop 3 {
    x := A_Index-1
    Loop 4 {
        y := A_Index-1
        arr[x, y] := x * y
    }
}
MsgBox arr[2, 3]