创建用于 COM 的安全数组.
ArrayObj := ComObjArray(VarType, Count1 , Count2, ... Count8)
ComObjArray
本身是一个派生自 ComValue
的类, 但只用于创建或识别 SafeArray 封装对象.
类型: 整数
数组的基类型(数组中每个元素的 VARTYPE). VARTYPE 被限制为变体类型的子集. 不能设置为 VT_ARRAY 或 VT_BYREF 标志. VT_EMPTY 和 VT_NULL 不是数组的有效基类型. 其他所有类型是合法的.有关可用值的列表, 请参阅 ComObjType.
类型: 整数
每个维度的大小. 支持最多 8 维的数组.
类型: ComObjArray
函数返回一个包含新的安全数组的包装器对象.
ComObjArray 对象支持下列方法:
.MaxIndex(n)
: 返回第 n 维的上界. 如果 n 省略, 默认为 1..MinIndex(n)
: 返回第 n 维的下界. 如果 n 省略, 默认为 1..Clone()
: 返回数组的副本..__Enum()
: 通常不由脚本调用; 允许 for-loop 与安全数组一起使用.目前, 这些都是硬编码的; 它们不作为属性存在, 也不受修改 ComObjArray.Prototype
的影响.
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 维的数组.
由于安全数组未被设计为支持多重引用, 故当一个安全数组被赋值为另一个安全数组的元素时, 会创建一个独立的副本. 不过, 仅当包装器对象含有 F_OWNVALUE 标志时才会发生这种情况, 这个标志表示它负责销毁此数组. 此标志可用 ComObjFlags 移除.
当被 COM 客户端调用的函数或方法返回一个带有 F_OWNVALUE 标志的安全数组时, 将建立并返回一个副本, 而原安全数组将自动销毁.
ComValue, ComObjType, ComObjValue, ComObjActive, ComObjFlags, Array Manipulation Functions (MSDN)
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]