ComObjArray() [v1.0.91+]

优质
小牛编辑
129浏览
2023-12-01

创建用于 COM 的 SafeArray.

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

参数

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

请参阅 ComObjType 了解允许值的列表.

CountN

每个维度的大小。可以支持多达 8 维的数组.

ArrayObj

包含 SafeArray 的包装器对象.

方法

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

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 循环 和 SafeArray 一起使用.

一般说明

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

if ComObjType(obj) & 0x2000
    MsgBox % "Array subtype: " . ComObjType(obj) & 0xfff
else
    MsgBox Not an array.

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

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

相关

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

示例

; 示例 #1:简单用法。

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
; 示例 #2:多维数组。

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]