Erstellt einen SafeArray, das für COM genutzt werden kann.
ArrayObj := ComObjArray(VarTyp, Anzahl1 , Anzahl2, ... Anzahl8)
Siehe ComObjType für eine Liste von möglichen Werten.
Die Größe jeder Dimension. Es werden Arrays mit bis zu 8 Dimensionen unterstützt.
Diese Funktion gibt ein Wrapper-Objekt zurück, das ein neues SafeArray enthält.
Array-Wrapper-Objekte unterstützen folgende Methoden:
Array.MaxIndex(n)
: Gibt die Obergrenze der n-ten Dimension zurück. Lässt man n weg, wird standardmäßig 1 verwendet.
Array.MinIndex(n)
: Gibt die Untergrenze der n-ten Dimension zurück. Lässt man n weg, wird standardmäßig 1 verwendet.
Array.Clone()
[v1.0.96.00+]: Gibt eine Kopie des Arrays zurück.
Array._NewEnum()
[v1.0.96.00+]: Wird üblicherweise nicht vom Skript aufgerufen; ermöglicht es, For-Schleifen in Kombination mit SafeArrays zu verwenden.
Array-Wrapper-Objekte können auch von COM-Methoden und ComObjActive() zurückgegeben werden. Skripte können wie folgt überprüfen, ob ein Wert ein Array ist:
if ComObjType(obj) & 0x2000 MsgBox % "Array-Subtyp: " . ComObjType(obj) & 0xfff else MsgBox Kein Array.
Es werden Arrays mit bis zu 8 Dimensionen unterstützt.
[v1.0.96.00+]: Da SafeArrays keinen Mechanismus zum Zählen von Referenzen haben, wird eine separate Kopie erstellt, wenn ein Element eines anderen SafeArrays ein SafeArray zugewiesen bekommt. Das geschieht allerdings nur, wenn das Wrapper-Objekt das F_OWNVALUE-Flag hat, um zu kennzeichnen, dass es für die Zerstörung des Arrays verantwortlich ist. Dieses Flag kann mit ComObjFlags() entfernt werden.
[v1.1.17.00+]: Wenn eine Funktion oder Methode, die über einen COM-Clienten aufgerufen wurde, einen SafeArray mit dem F_OWNVALUE-Flag zurückgibt, wird eine Kopie erstellt und diese stattdessen zurückgegeben, da das originale SafeArray automatisch zerstört wird.
ComObjType(), ComObjValue(), ComObjActive(), ComObjFlags(), Array Manipulation Functions (Microsoft Docs)
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) ; Ermittelt die Anzahl an Dimensionen: dim := DllCall("oleaut32\SafeArrayGetDim", "ptr", ComObjValue(arr)) ; Ermittelt die Grenzen jeder Dimension: Loop %dim% dims .= arr.MinIndex(A_Index) " .. " arr.MaxIndex(A_Index) "`n" MsgBox %dims% ; Einfache Verwendung: Loop 3 { x := A_Index-1 Loop 4 { y := A_Index-1 arr[x, y] := x * y } } MsgBox % arr[2, 3]