Creates a SafeArray for use with COM.
ArrayObj := ComObjArray(VarType, Count1 , Count2, ... Count8)
ComObjArray itself is a class derived from ComValue, but is used only to create or identify SafeArray wrapper objects.
Type: Integer
The base type of the array (the VARTYPE of each element of the array). The VARTYPE is restricted to a subset of the variant types. Neither the VT_ARRAY nor the VT_BYREF flag can be set. VT_EMPTY and VT_NULL are not valid base types for the array. All other types are legal.See ComObjType for a list of possible values.
Type: Integer
The size of each dimension. Arrays containing up to 8 dimensions are supported.
Type: ComObjArray
This function returns a wrapper object containing a new SafeArray.
ComObjArray objects support the following methods:
.MaxIndex(n): Returns the upper bound of the nth dimension. If n is omitted, it defaults to 1..MinIndex(n): Returns the lower bound of the nth dimension. If n is omitted, it defaults to 1..Clone(): Returns a copy of the array..__Enum(): Not typically called by script; allows for-loops to be used with SafeArrays.ComObjArray objects may also be returned by COM methods and ComValue. Scripts may determine if a value is a ComObjArray as follows:
; Check class
if obj is ComObjArray
MsgBox "Array subtype: " . ComObjType(obj) & 0xfff
else
MsgBox "Not an array."
; Check for VT_ARRAY
if ComObjType(obj) & 0x2000
MsgBox "obj is a ComObjArray"
; Check specific array type
if ComObjType(obj) = 0x2008
MsgBox "obj is a ComObjArray of strings"
Arrays with up to 8 dimensions are supported.
Since SafeArrays are not designed to support multiple references, when one SafeArray is assigned to an element of another SafeArray, a separate copy is created. However, this only occurs if the wrapper object has the F_OWNVALUE flag, which indicates it is responsible for destroying the array. This flag can be removed by using ComObjFlags.
When a function or method called by a COM client returns a SafeArray with the F_OWNVALUE flag, a copy is created and returned instead, as the original SafeArray is automatically destroyed.
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)
; Get the number of dimensions:
dim := DllCall("oleaut32\SafeArrayGetDim", "ptr", ComObjValue(arr))
; Get the bounds of each dimension:
dims := ""
Loop dim
dims .= arr.MinIndex(A_Index) " .. " arr.MaxIndex(A_Index) "`n"
MsgBox dims
; Simple usage:
Loop 3 {
x := A_Index-1
Loop 4 {
y := A_Index-1
arr[x, y] := x * y
}
}
MsgBox arr[2, 3]