# ComObjArray() [v1.0.91+]

创建用于 COM 的安全数组(SafeArray).

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

## 参数

VarType
  数组的基类型(数组中每个元素的变量类型). VarType 被限制为变量类型的子集. 不能设置为 VT_ARRAY 和 VT_BYREF. VT_EMPTY 及 VT_NULL 不是数组的合法基类型. 其他所有类型是合法的.

  有关可用值的列表请参见 ComObjType.

CountN

  每个维度的大小. 支持最多 8 维的数组.

ArrayObj

  包含安全数组的包装器对象.

## 方法

数组包装器对象支持下列方法:

`Array.MaxIndex(n)`: 返回第 n 维的上界. 如果 n 省略, 默认为 1.

`Array.MinIndex(n)`: 返回第 n 维的下界. 如果 n 省略, 默认为 1.

`Array.Clone()` [v1.0.96.00+]: 返回数组的副本.

`Array._NewEnum()` [v1.0.96.00+]: 通常不是由脚本调用; 允许 for 循环与安全数组一起使用.

## 一般说明

COM 方法和 ComObjActive() 也可以返回数组包装器对象. 脚本中可以使用如下方法判断一个值是否为数组:

    if ComObjType(obj) & 0x2000
        MsgBox % "数组子类:" . ComObjType(obj) & 0xfff
    else
        MsgBox 非数组.

可以支持多达 8 维的数组.

[v1.0.96.00+]: 由于安全数组未被设计为支持多重引用, 故当一个安全数组被赋值为另一个安全数组的元素时, 会创建一个独立的副本. 不过, 仅当包装器对象含有 F_OWNVALUE 标志时才会发生这种情况, 这个标志表示它负责销毁此数组. 此标志可用 ComObjFlags 移除.

[v1.1.17.00+]: 当被 COM 客户端调用的函数或方法返回一个带有 F_OWNVALUE 标志的安全数组时, 将建立并返回一个副本, 而原安全数组将自动销毁.

## 相关

ComObjType, ComObjValue, ComObjActive, ComObjFlags, Array Manipulation Functions(数组操作函数) (MSDN)

## 示例

简单用法.

    arr := ComObjArray(VT_VARIANT:=12, 3)
    arr[0] := "Auto"
    arr[1] := "Hot"
    arr[2] := "key"
    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))

    ; 获取各个维度的边界:
    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]

dftg