COM で使用する SafeArray を作成します。
ArrayObj := ComObjArray(VarType, Count1 , Count2, ... Count8)
ComObjArray自体はComValueから派生したクラスですが、SafeArrayのラッパーオブジェクトを作成または識別するためにのみ使用されます。
型:整数
配列の基本型(配列の各要素のVARTYPE)。VARTYPEは、バリアントタイプのサブセットに限定されます。VT_ARRAYフラグ、VT_BYREFフラグのいずれも設定できない。VT_EMPTY と VT_NULL は、配列のベースタイプとして有効ではありません。それ以外のタイプはすべて合法です。取り得る値の一覧は、ComObjTypeをご覧ください。
型:整数
各寸法の大きさです。最大8次元までの配列に対応しています。
型:ComObjArray
この関数は、新しい SafeArray を含むラッパーオブジェクトを返します。
ComObjArray オブジェクトは、以下のメソッドをサポートしています:
.MaxIndex(n):n次元の上限値を返す。nが省略された場合、デフォルトは 1 です。.MinIndex(n):n次元目の下界を返します。nが省略された場合、デフォルトは 1 です。.Clone():配列のコピーを返します。.__Enum():SafeArraysでforループを使用することができます。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は自動的に破棄されるため、代わりにコピーが作成されて返されます。
ComValue、ComObjType、ComObjValue、ComObjActive、ComObjFlags、Array 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]