<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1632085368384154" crossorigin="anonymous"></script><script src="https://autohotkey.top/gtag.js"></script></head> <body> <h1>ComObjArray</h1> <p>创建用于 COM 的安全数组.</p> <pre class="Syntax">ArrayObj := <span class="func">ComObjArray</span>(VarType, Count1 <span class="optional">, Count2, ... Count8</span>)</pre> <p><code>ComObjArray</code> 本身是一个派生自 <code>ComValue</code> 的<a href="Class.htm">类</a>, 但只用于创建或识别 SafeArray 封装对象.</p <h2 id="Parameters">参数</h2> <dl> <dt>VarType</dt> <dd> <p>类型: <a href="../Concepts.htm#numbers">整数</a></p> 数组的基类型(数组中每个元素的 VARTYPE). VARTYPE 被限制为<a href="ComObjType.htm#vt">变体类型</a>的子集. 不能设置为 VT_ARRAY 或 VT_BYREF 标志. VT_EMPTY 和 VT_NULL 不是数组的有效基类型. 其他所有类型是合法的. <p>有关可用值的列表, 请参阅 <a href="ComObjType.htm">ComObjType</a>.</p> </dd> <dt>Count<i>N</i></dt> <dd> <p>类型: <a href="../Concepts.htm#numbers">整数</a></p> <p>每个维度的大小. 支持最多 8 维的数组.</p> </dd> </dl> <h2 id="Return_Value">返回值</h2> <p>类型: ComObjArray</p> <p>函数返回一个包含新的安全数组的包装器对象.</p> <h2 id="Methods">方法</h2> <p>ComObjArray 对象支持下列方法:</p> <ul> <li><code>.MaxIndex(n)</code>: 返回第 <i>n</i> 维的上界. 如果 <i>n</i> 省略, 默认为 1.</li> <li><code>.MinIndex(n)</code>: 返回第 <i>n</i> 维的下界. 如果 <i>n</i> 省略, 默认为 1.</li> <li><code>.Clone()</code>: 返回数组的副本.</li> <li><code>.__Enum()</code>: 通常不由脚本调用; 允许 <a href="For.htm">for-loop</a> 与安全数组一起使用.</li> </ul> <p>目前, 这些都是硬编码的; 它们不作为属性存在, 也不受修改 <code>ComObjArray.Prototype</code> 的影响.</p> <h2 id="Remarks">备注</h2> <p>ComObjArray 对象也可以由 COM 方法和 <a href="ComValue.htm">ComValue</a> 返回. 脚本可以确定一个值是否是 ComObjArray, 如下所示:</p> <pre><em>; 检查类</em> if obj is ComObjArray MsgBox "Array subtype: " . ComObjType(obj) &amp; 0xfff else MsgBox "Not an array." <em>; 检查 VT_ARRAY</em> if ComObjType(obj) &amp; 0x2000 MsgBox "obj is a ComObjArray" <em>; 检查特定的数组类型</em> if ComObjType(obj) = 0x2008 MsgBox "obj is a ComObjArray of strings"</pre> <p>可以支持多达 8 维的数组.</p> <p>由于安全数组未被设计为支持多重引用, 故当一个安全数组被赋值为另一个安全数组的元素时, 会创建一个独立的副本. 不过, 仅当包装器对象含有 F_OWNVALUE 标志时才会发生这种情况, 这个标志表示它负责销毁此数组. 此标志可用 <a href="ComObjFlags.htm">ComObjFlags</a> 移除.</p> <p>当被 COM 客户端调用的函数或方法返回一个带有 F_OWNVALUE 标志的安全数组时, 将建立并返回一个副本, 而原安全数组将自动销毁.</p> <h2 id="Related">相关</h2> <p><a href="ComValue.htm">ComValue</a>, <a href="ComObjType.htm">ComObjType</a>, <a href="ComObjValue.htm">ComObjValue</a>, <a href="ComObjActive.htm">ComObjActive</a>, <a href="ComObjFlags.htm">ComObjFlags</a>, <a href="https://learn.microsoft.com/previous-versions/windows/desktop/automat/array-manipulation-functions">Array Manipulation Functions (Microsoft Docs)</a></p> <h2 id="Examples">示例</h2> <div class="ex" id="ExBasic"> <p><a class="ex_number" href="#ExBasic"></a> 简单示例.</p> <pre>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 </pre> </div> <div class="ex" id="ExMultiDims"> <p><a class="ex_number" href="#ExMultiDims"></a> 多维数组.</p> <pre>arr := ComObjArray(VT_VARIANT:=12, 3, 4) <em>; 获取数组的维数:</em> dim := DllCall("oleaut32\SafeArrayGetDim", "ptr", ComObjValue(arr)) <em>; 得到每个维度的边界:</em> dims := "" Loop dim dims .= arr.MinIndex(A_Index) " .. " arr.MaxIndex(A_Index) "`n" MsgBox dims <em>; 简单用法:</em> Loop 3 { x := A_Index-1 Loop 4 { y := A_Index-1 arr[x, y] := x * y } } MsgBox arr[2, 3] </pre> </div> <a href="https://dftg.net">dftg</a><!-- Cloudflare Pages Analytics --><script defer src='https://static.cloudflareinsights.com/beacon.min.js' data-cf-beacon='{"token": "d5a9c4fcb9b6482fa53ce820d892f969"}'></script><!-- Cloudflare Pages Analytics --><script defer src="https://static.cloudflareinsights.com/beacon.min.js/vcd15cbe7772f49c399c6a5babf22c1241717689176015" integrity="sha512-ZpsOmlRQV6y907TI0dKBHq9Md29nnaEIPlkf84rnaERnq6zvWvPUqr2ft8M1aS28oN72PdrCzSjY4U6VaAw1EQ==" data-cf-beacon='{"rayId":"92e7b830da2a10db","version":"2025.3.0","r":1,"serverTiming":{"name":{"cfExtPri":true,"cfL4":true,"cfSpeedBrain":true,"cfCacheStatus":true}},"token":"51750bb5dc4f40cc91a5ec55c63bbc01","b":1}' crossorigin="anonymous"></script> </body> </html>