# com 库模块帮助文档

## com 成员列表 <a id="com" href="#com">&#x23;</a>

COM 组件支持库,  
虽然这是内置库，但例外的是这个库不会自动导入,  
如果在已经导入win.ui 的界面线程，win.ui 会负责自动导入 com 库  
[使用手册相关文档](https://www.aardio.com/zh-cn/docs/library-guide/builtin/com/com.html)

### com.AddConnection <a id="com.AddConnection" href="#com.AddConnection">&#x23;</a>
添加 COM 对象事件接收器。

### com.AddConnection(comObject,eventSink) <a id="com.AddConnection" href="#com.AddConnection">&#x23;</a>

```aardio
添加 COM 对象事件接收器。  

参数 @comObject 指定需要监听事件的 COM 对象。  
参数 @comObject 指定的对象如果被释放回收，事件监听也会自动解除。   
注意 excel.ActiveWorkbook 这种动态属性应当先保存到变量，再绑定事件  

参数 @eventSink 支持以下两种事件接收器：  
- 使用 com.ImplInterface 函数创建的动态事件接口。  
- 使用 com.interface 实现的原生静态事件接口。  

注册成功返回一个表示事件连接点的 cookie 。  
cookie 可作为释放绑定的 com.ReleaseConnection 函数的参数。
```

### com.Connect <a id="com.Connect" href="#com.Connect">&#x23;</a>
注册事件接收表  
此函数返回sink,cookie 共2个返回值，  
sink为事件接收器,cookie是一个数字值,用来记录连接点，  
这2个返回值可以用于 com.ReleaseConnection 释放事件表。

### com.Connect(COM对象,事件监听表) <a id="com.Connect" href="#com.Connect">&#x23;</a>
参数 @2 指定一个 table 类型的表对象  
该表对象被转换为COM对象的默认事件监听器并实现默认事件接口,  
如果需要显式指定接口类型请使用 com.AddConnection。  

com.Connect 绑定的事件监听表会被强引用到 COM对象   
如果COM对象与事件接收表存在循环引用自身会导致无法释放,  
可用 com.ReleaseConnection 手动释放事件绑定,  
或者改用 com.ConnectWeak,com.CreateEmbedEx 也可以避免该问题。  

参数 @1 指定的对象如果被释放回收，事件监听也会自动解除。  
注意 excel.ActiveWorkbook 这种动态属性应当先保存到变量，再绑定事件

### com.ConnectWeak <a id="com.ConnectWeak" href="#com.ConnectWeak">&#x23;</a>
注册弱引用自身的事件接收表  
此函数返回sink,cookie 共2个返回值，  
sink为事件接收器,cookie是一个数字值,用来记录连接点，  
这2个返回值可以用于 com.ReleaseConnection 释放事件表

### com.ConnectWeak(COM对象,事件接收表) <a id="com.ConnectWeak" href="#com.ConnectWeak">&#x23;</a>
参数@2指定一个table类型的表对象  
该表对象被创建为COM对象的默认事件接口并注册为事件接收器。  

在COM对象销毁前，com.Connect绑定的事件接收表会被强引用并被阻止回收，  
如果COM对象与事件接收表存在循环引用自身会导致COM对象无法释放,  
com.ConnectWeak函数通过创建一个中间代理对象弱引用事件接收表，可以避免该问题，  
但要注意回调事件访问的owner对象是代理对象,使用owner.realSink可以获取真正的事件表

### com.CreateEmbed <a id="com.CreateEmbed" href="#com.CreateEmbed">&#x23;</a>
创建 COM 控件对象,  
通常不会直接使用此函数,  
应改用窗口或控件对象提供的 CreateEmbed 或 CreateEmbedEx 函数,  
或者 com.lite 提供的 CreateEmbed 或 CreateEmbedEx 函数

### com.CreateEmbed() <a id="com.CreateEmbed" href="#com.CreateEmbed">&#x23;</a>
[返回对象:embedObject](https://www.aardio.com/zh-cn/docs/library-reference/com/_.html#embedObject)

### com.CreateEmbed(embedObject,formOrCtrl,comObject) <a id="com.CreateEmbed" href="#com.CreateEmbed">&#x23;</a>
创建 COM 控件对象并嵌入 @formOrCtrl 指定的窗体或控件窗口  
@comObject 参数指定 com.IDispatch 对象,  
@embedObject 用一个表指定容器对象

### com.CreateEmbed(embedObject,formOrCtrl,progId,preferredInvokeKind) <a id="com.CreateEmbed" href="#com.CreateEmbed">&#x23;</a>
创建 COM 控件对象并嵌入 @formOrCtrl 指定的窗体或控件窗口  
@progId 指定要创建的 COM 控件的 ProgID 或者 CLSID  
@embedObject 用一个表指定容器对象  
容器对象可以是一个空的表用于接管 COM对象。  
@preferredInvokeKind 参数作用与 com.SetPreferredInvokeKind 的参数相同，不必指定。  

函数返回该容器对象并添加成员_host,_object,_form  
_object 成员是创建的 COM对象 ,  
_form 是传入参数中的 @formOrCtrl,  
_host 是 COM 控件宿主对象,提供部分 OLE 接口函数,  

容器对象可通过添加成员函数响应 COM对象 事件，  
容器对象的另主要作用是充当访问 COM对象 的中间代理对象。  
通常使用 util.metaProperty 为容器对象添加属性元表，  
属性元表可拦截属性、函数调用并调用 _object 对象

### com.CreateEmbedEx <a id="com.CreateEmbedEx" href="#com.CreateEmbedEx">&#x23;</a>
创建 COM 控件，返回控件容器对象。  
容器对象的 _object 成员是创建的 COM 对象。  
容器对象的 __event__ 成员为 COM 对象默认事件监听器。  

返回容器已添加元表，可通过容器对象的成员代理访问 COM 对象成员。  
也可以通过指定容器对象的成员函数响应 COM 对象事件

### com.CreateEmbedEx(clsId,ctrlOrForm,embedObject) <a id="com.CreateEmbedEx" href="#com.CreateEmbedEx">&#x23;</a>
创建 COM 控件,返回控件容器对象。  
此函数返回的容器已添加元表并创建代理以直接访问 COM对象，  
也可以通过指定容器对象的成员函数响应 COM 对象事件。  
@clsId 指定控件 CLSID 或者 ProgID 。  
可选用 @ctrlOrForm 指定宿主窗口，  
如果指定了窗主窗口，在窗口销毁时解除默认事件监听器并释放 COM 对象。  
可选在参数 @embedObjec 中指定 COM对象 绑定的容器对象

### com.CreateObject("字符串参数") <a id="com.CreateObject" href="#com.CreateObject">&#x23;</a>
创建并返回 com.IDispatch 对象,参数@1可指定 CLSID 或 ProgID,  
创建失败会抛出异常,使用 com.TryCreateObject 代替不会抛异常

### com.DoObjectVerb(OLE对象,-1) <a id="com.DoObjectVerb" href="#com.DoObjectVerb">&#x23;</a>
执行OLE对象的动词,  
参数2可使用_OLEIVERB_前缀常量

### com.DumpTypeInfo <a id="com.DumpTypeInfo" href="#com.DumpTypeInfo">&#x23;</a>
输出 COM对象  类型信息、成员函数列表，  
输出到控制台可使用 console.dump 函数。  

调用 com.tlbDoc.dump 函数可打印 COM对象 更详细的类型库信息

### com.DumpTypeInfo(comObject) <a id="com.DumpTypeInfo" href="#com.DumpTypeInfo">&#x23;</a>
返回一个字符串  
包含 COM对象  类型信息、成员函数列表,  
此函数不会输出到控制台,  
输出到控制台请使用 console.dump 函数

### com.GetEnumerator() <a id="com.GetEnumerator" href="#com.GetEnumerator">&#x23;</a>
获取枚举对象,  
参数 @1 指定 COM对象

[返回对象:comEnumeratorObject](#comEnumeratorObject)

### com.GetIUnknown(COM对象 或指针,GUID) <a id="com.GetIUnknown" href="#com.GetIUnknown">&#x23;</a>
使用 GUID 指定接口获取 com.IUnknown 托管指针  
参数@1可是任何可以转换为指针的对象,与API参数规则相同,  
可选在参数@2使用字符串或GUID指定接口  
该指针自动管理引用计数，无须手动释放

### com.GetObject("字符串参数") <a id="com.GetObject" href="#com.GetObject">&#x23;</a>
从已运行的实例获取并返回 com.IDispatch 对象,  
参数@1可指定CLSID或ProgID,也可指定打开的文件路径,如 doc 文件,  
获取对象失败会抛出异常,使用 com.TryGetObject 代替不会抛异常。   

如果当前进程与目标 COM 服务进程不具有相同权限，则会报错『无效的操作』。

### com.GetOrCreateObject("字符串参数") <a id="com.GetOrCreateObject" href="#com.GetOrCreateObject">&#x23;</a>
参数可指定一个或多个CLSID/ProgID,  
首先调用 com.TryGetObject 尝试获取并返回已运行的实例,  
如果失败则调用 com.TryCreateObject 函数尝试创建并返回对象,  

创建失败返回null,错误信息,不会抛出异。  

如果当前进程与目标 COM 服务进程不具有相同权限，  
则 TryGetObject 不能获取该进程创建的 COM 对象。

### com.GetPointer(COM对象 ) <a id="com.GetPointer" href="#com.GetPointer">&#x23;</a>
获取 IDispatch 指针  
该指针返回前已调用 AddRef 增加 COM 引用计数,  
不再使用时必须及时调用 com.Release 释放

### com.GetPointer(COM对象 或指针,GUID) <a id="com.GetPointer" href="#com.GetPointer">&#x23;</a>
使用 GUID 指定接口获取原生指针,  
该指针返回前已调用AddRef增加COM引用计数,  
不再使用时必须及时调用 com.Release 释放,  
参数@1可是 COM对象  、com.IUnknown对象、或可转换为指针的对象  
参数@2可用文本格式表示,省略时默认为IID_IUnknown

### com.GetTypeInfo() <a id="com.GetTypeInfo" href="#com.GetTypeInfo">&#x23;</a>
[返回对象:comTypeInfoObject](#comTypeInfoObject)

### com.GetTypeInfo(/*COM对象 */) <a id="com.GetTypeInfo" href="#com.GetTypeInfo">&#x23;</a>
返回类型信息

### com.ImplInterface(implObject) <a id="com.ImplInterface" href="#com.ImplInterface">&#x23;</a>
将 aardio 对象转换为支持 IDispatch 接口的 COM对象 ，  
参数@1可以是普通表对象、函数对象、类对象、cdata对象。  

如果参数@1是函数或类对象,回调时 owner 参数为 dispIdMember 数值。  
如果参数@1是表对象转换为 COM对象 ，直接作为 COM 函数调用时支持 _call元方法，  
如果未定义 _call元方法则调用表对象中索引为0的函数  
通过 COM 接口调用表的成员函数时支持 _get 元方法，并将 ownerCall 参数设为 true。  

表对象或表的成员函数作为COM函数回调时 owner 参数总是指向表对象自身,  
dispIdMember小于0时总是调用表索引中对应的函数,  

在与 COM 接口交互时，  
无法自动转换为 COM对象的 aardio 对象也会调用此函数自动转换

### com.ImplInterface(implTable,progID,interfaceName) <a id="com.ImplInterface" href="#com.ImplInterface">&#x23;</a>
使用一个 table 表转换为 @interfaceName 指定的接口对象  
例如：com.ImplInterface( flash.callevent ,"ShockwaveFlash.ShockwaveFlash","_IShockwaveFlashEvents")

### com.ImplInterfaceFromTypelib(implTable,typelibPath,interfaceName,coclassNname) <a id="com.ImplInterfaceFromTypelib" href="#com.ImplInterfaceFromTypelib">&#x23;</a>
使用类型库实现com接口

### com.IsIUnknown(任意参数) <a id="com.IsIUnknown" href="#com.IsIUnknown">&#x23;</a>
检测参数是否一个托管 com.IUnknown 指针

### com.IsMember(comObject,memberName) <a id="com.IsMember" href="#com.IsMember">&#x23;</a>
返回参数 @memberName 指定的名字是否 @comObject 参数指定 COM 对象的成员。

### com.IsNetObject(任意对象) <a id="com.IsNetObject" href="#com.IsNetObject">&#x23;</a>
检测参数是否一个 .NET 原生对象，是则返回非 0 值。  
如果是普通 .NET 对象返回 1，如果是 DispatchableObject 对象返回 2

### com.IsObject(任意对象) <a id="com.IsObject" href="#com.IsObject">&#x23;</a>
检测参数是否一个动态 COM对象（IDispatch 对象）

### com.LoadTypeLibrary(".tlb") <a id="com.LoadTypeLibrary" href="#com.LoadTypeLibrary">&#x23;</a>
加载类型库  
参数可以是CLSID、类型库路径、或包含类型库资源的组件路径

### com.LoadTypeLibrary() <a id="com.LoadTypeLibrary" href="#com.LoadTypeLibrary">&#x23;</a>
[返回对象:comTypeLibObject](#comTypeLibObject)

### com.NewControl(tab,progId) <a id="com.NewControl" href="#com.NewControl">&#x23;</a>
创建COM控件,可选使用参数@3指定tlb类型库路径  
此函数详细用法请参考标准库com.activeX的源代码

### com.NewObject(tab,progId) <a id="com.NewObject" href="#com.NewObject">&#x23;</a>
创建COM对象,可选使用参数@3指定tlb类型库路径  
此函数详细用法请参考标准库com.activeX的源代码

### com.QueryObject(IUnknown指针 ) <a id="com.QueryObject" href="#com.QueryObject">&#x23;</a>
查询 IDispatch 接口、并创建 com.IDispatch 对象

### com.QueryObjectR(IUnknown指针 ) <a id="com.QueryObjectR" href="#com.QueryObjectR">&#x23;</a>
查询 IDispatch 接口、并创建 com.IDispatch 对象  
如果成功则调用 com.Release 释放传入的 IUnknown 指针  
使其引用计数减一,释放的指针不应再使用,  
返回的 COM对象 会增加引用计数,  
并在对象释放时自动减一

### com.Release() <a id="com.Release" href="#com.Release">&#x23;</a>
释放 COM 对象、.NET 对象、IUnknown 指针、com.interface 创建的对象。  
如果参数 是 pointer 类型指针调用 IUnknown 接口 Release 函数使引用计数减一  
如果参数是 cdata 内核对象或自元表中返回 cdata,则调用 cdata 的 _gc 析构函数  

参数 @1 为 null 抛出异常

### com.ReleaseConnection <a id="com.ReleaseConnection" href="#com.ReleaseConnection">&#x23;</a>
释放 COM 对象事件接收器。

### com.ReleaseConnection(comObject) <a id="com.ReleaseConnection" href="#com.ReleaseConnection">&#x23;</a>
释放由 com.Connect 函数绑定的默认事件接口接收器。  
参数 @comObject 指定要解除事件接收器的 COM对象。  

n即使不调用此函数，在 COM对象 销毁前会自动释放所有事件接收器。

### com.ReleaseConnection(comObject,eventSink, cookie) <a id="com.ReleaseConnection" href="#com.ReleaseConnection">&#x23;</a>
释放 COM 对象事件接收器。  

@comObject 指定要解除事件监听的 COM对象。  

参数 @eventSink 支持以下两种事件接收器：  
- 使用 com.ImplInterface 或 com.Connect 函数创建的动态事件接口。  
- 使用 com.interface 实现的原生静态事件接口  

@cookie 来自 com.AddConnection 或 com.Connect 的返回值  

即使不调用此函数，  
在 COM对象 销毁前也会释放所有事件。

### com.RoundTrip() <a id="com.RoundTrip" href="#com.RoundTrip">&#x23;</a>
将aardio对象转换为COM对象，  
再将该 COM对象 转换为aardio对象

### com.SafeArray <a id="com.SafeArray" href="#com.SafeArray">&#x23;</a>
创建或获取 COM 安全数组（SAFEARRAY）。

### com.SafeArray(ptrSSafeArray,variantType) <a id="com.SafeArray" href="#com.SafeArray">&#x23;</a>
自 SAFEARRAY 内存指针获取 COM 安全数组。  
参数 @ptrSSafeArray 必须指定 pointer 类型指针（C++ 类型声明为 SAFEARRAY*）。  
参数 @variantType 指定元素类型，省略则默认为 _VT_UI1 。  

如果 @variantType 为 _VT_UI1 则将数组转换为缓冲区（ buffer ）返回。  
其他类型转换为普通数组，并且数组元表的 _safearray_type 声明了 COM 数组类型。  
与使用 com.SafeArray 函数创建的 COM 安全数组格式相同。

### com.SafeArray(variantType,...) <a id="com.SafeArray" href="#com.SafeArray">&#x23;</a>
创建 COM 安全数组（SAFEARRAY）。  
在 aardio 中 COM 数组默认存为纯数组对象，但数组元表的 _safearray_type 声明了 COM 数组类型。  
COM 函数传入传出 COM 数组均默认使用此格式。  

参数 @variantType 可指定表示 COM 数组类型的数值，支持 _VT_ 前缀的自动完成常量。  
不指定 @variantType 时默认为 _VT_VARIANT（ 可兼容 VBS 数组）。  
类型为 _VT_ILLEGAL 则单个值与数组元素类型均自动设定，这是调用 COM 接口的默认规则。  
	- 纯字符串数组默认元素类型为 _VT_BSTR,  
	- 纯数值类型默认元素类型为 _VT_R8（double）,  
	- IDispatch 对象数组元素类型为 _VT_DISPATCH，  
	- 其他数组元素类型默认为 _VT_VARIANT  

可选增加一个或多个参数指定初始化时添加到数组的成员。

### com.SafeArrayType() <a id="com.SafeArrayType" href="#com.SafeArrayType">&#x23;</a>
如果传入参数为 COM 安全数组（SAFEARRAY），  
则返回一个表示 COM 数组元素类型的数值,该值应以 _VT_ 前缀的常量进行比对。  
支持 com.SafeArray 创建的 COM 数组，或 COM 函数返回的数组。  
参数如果是 com.Variant 创建的 Variant 对象，返回 null，   
参数是其他类型值，也返回 null。

### com.SetPreferredArrayType(/*COM 对象*/,0xC/*_VT_VARIANT*/) <a id="com.SetPreferredArrayType" href="#com.SetPreferredArrayType">&#x23;</a>
设置调用该 COM对象 时 aardio 数组参数转 COM 数组的默认类型，  
参数只能设为 _VT_VARIANT 或 _VT_ILLEGAL,默认已设置为 _VT_ILLEGAL。  
此设置值会自动传递到该 COM对象 返回的其他 COM对象 。  

此选项设为 _VT_ILLEGAL 将自动调整为合适的类型,规则如下：  
纯字符串数组类型设为 _VT_BSTR,  
纯数值数组类型设为 _VT_R8（double），  
其他数组类型设为 _VT_VARIANT，  
这也是所有 COM对象 的默认设置。  

如果要创建明确指定 COM 类型的数组参数，  
可使用 com.Variant,COM.SafeArray,COM.toSafeArray,com.int ... 等函数

### com.SetPreferredInvokeKind(/*COM 对象*/,1/*_INVOKE_FUNC*/) <a id="com.SetPreferredInvokeKind" href="#com.SetPreferredInvokeKind">&#x23;</a>
设置以函数方式调用 COM 对象时，是否总是将 COM 对象作为方法调用。  
此选项会影响到所有通过该 COM 对象创建或返回的其他 COM 对象。  
参数 @2 只能省略（默认自动选择）或者指定为 1/*_INVOKE_FUNC*/。  

只有极个别 COM 对象在自动选择时报错（极为罕见）才需要调用此函数。  
在默认设置下，如果无法通过类型信息或 get,set 前缀确定是调用方法还是属性，  
则由目标 COM 对象自动选择调用方式。  

如果调用此函数并设参数为 INVOKE_FUNC, 且调用 com.SetPreferredArrayType 并设参数为 VT_ILLEGAL，  
则该 COM 对象所有传入传出的所有时间对象总是自动转换为 UTC 时间（不改变入参）。

### com.ShowHelp(/*COM对象 */) <a id="com.ShowHelp" href="#com.ShowHelp">&#x23;</a>
显示帮助

### com.TryCreateObject(cls,...) <a id="com.TryCreateObject" href="#com.TryCreateObject">&#x23;</a>
参数可指定一个或多个CLSID/ProgID,逐个测试直到创建成功,  
成功返回 com.IDispatch 对象,  
创建失败返回null,错误信息,不会抛出异常,  
参数@1可指定 CLSID或 ProgID

### com.TryGetObject("字符串参数") <a id="com.TryGetObject" href="#com.TryGetObject">&#x23;</a>
从已运行的实例获取并返回 com.IDispatch 对象,  
参数可指定一个或多个 CLSID/ProgID,也可指定要打开的文件路径,如doc文件,  

创建失败返回null,错误信息,不会抛出异常。  

如果当前进程与目标 COM 服务进程不具有相同权限，则会返回 null。

### com.Variant <a id="com.Variant" href="#com.Variant">&#x23;</a>
创建 VARIANT 变体对象。  
可用于普通 COM对象 传值或传址参数。  
可用于 .NET 普通输入参数，不支持 .NET 输出参数（可改用 dotNet.object）。  
可用于 API 函数中 `VARIANT*` 指针类型参数。

### com.Variant() <a id="com.Variant" href="#com.Variant">&#x23;</a>
[返回对象:comVariantObject](#comVariantObject)

### com.Variant(初始值,变体类型,输出引用) <a id="com.Variant" href="#com.Variant">&#x23;</a>
可选指定一个初始值，可以是任意适用于 COM 参数的值或数组。  

参数 @2 可选用一个 _VT_ 前缀的整数常量指定期望的 COM 变体类型。  
变体类型指定数值，且参数 @1 为无元表的空表或非空数组时都会处理为 COM 数组。  

若省略类型或设为 _VT_VARIANT，则单值自动选择类型，未明确类型的数组设为 VT_VARIANT。  
如果变体类型为 _VT_ILLEGAL，则单值与数组均自动选择类型，此为 COM 接口默认规则。  

单整数默认类型为 _VT_I4（int）,小数默认类型为 _VT_R8（double）,  
纯字符串数组默认为 _VT_BSTR 数组,纯数值类型默认为 _VT_R8（double）数组,  
其他数组类型默认为 _VT_VARIANT 数组。  

可选参数 @3 如果设为 true，就可以用于 COM 输出参数。

### com.Variant(指针,true) <a id="com.Variant" href="#com.Variant">&#x23;</a>
创建 VARIANT 变体对象  
如果参数@2为 true ，则参数 @1 必须为 VARIANT 指针。  
调用 VariantCopyInd 函数拷贝参数指定的源 VARIANT 对象

### com.byte() <a id="com.byte" href="#com.byte">&#x23;</a>
定义数值类型为 8 位整数，  
作为输入参数可兼容 .NET System.SByte 类型数值。  
参数 @1 可以为数值或数组，  
参数 @2 为 true 则用于 COM 输出引用参数。  

此函数返回 com.Variant 对象。

[返回对象:comVariantObject](#comVariantObject)

### com.double() <a id="com.double" href="#com.double">&#x23;</a>
定义数值类型为 64 位浮点数，  
此函数返回 com.Variant 对象。  
作为输入参数可兼容 .NET System.Double 类型数值。  
参数 @1 可以为数值或数组，  
参数 @2 为 true 则用于 COM 输出引用参数。  

注意普通数值传入 COM 参数时，  
整数默认转为32位整数，小数默认按double类型处理

[返回对象:comVariantObject](#comVariantObject)

### com.each <a id="com.each" href="#com.each">&#x23;</a>

```aardio
for index,obj in com.each() {  

} //迭代遍历com集合对象，参数可以直接传入COM迭代器
```

### com.eachRunning(interface,name) <a id="com.eachRunning" href="#com.eachRunning">&#x23;</a>

```aardio
for object,interface,name,index in com.eachRunning() {
	/*遍历ROT（运行对象表）  
参数 @interface 可选限定接口名（完全匹配），参数 @name 可选用模式串限定显示名称。   
返回 object为 COM 对象 ,interface 为接口名称（可能为 null）,name 为显示名称。index 为序号*/
}
```

### com.enumRunning(回调函数) <a id="com.enumRunning" href="#com.enumRunning">&#x23;</a>

```aardio
com.enumRunning(   
	function(displayName,object){    
		/*枚举ROT（运行对象表）并获取COM对象,  
此回调函数返回true中止枚举*/  
	}  
)
```

### com.first() <a id="com.first" href="#com.first">&#x23;</a>
对传入的 COM对象 调用 com.each 创建迭代器,  
执行该迭代器并返回第一次返回的 COM对象 ,  
如果传入参数为 null 或 false 则直接返回

### com.float() <a id="com.float" href="#com.float">&#x23;</a>
定义数值类型为 32 位浮点数，  
作为输入参数可兼容 .NET System.Single 类型数值。  
参数 @1 可以为数值或数组，  
参数 @2 为 true 则用于 COM 输出引用参数。  

此函数返回 com.Variant 对象。

### com.int() <a id="com.int" href="#com.int">&#x23;</a>
定义数值类型为 32 位整数，  
此函数返回 com.Variant 对象。  
作为输入参数可兼容 .NET System.Int32 类型数值。  
参数 @1 可以为数值或数组，  
参数 @2 为 true 则用于 COM 输出引用参数。  

注意普通数值传入 COM 参数时，  
整数默认转为32位整数，小数默认按double类型处理

[返回对象:comVariantObject](#comVariantObject)

### com.isEnumerator(对象) <a id="com.isEnumerator" href="#com.isEnumerator">&#x23;</a>
检查并返回参数指定的对象是否 COM 迭代器

### com.long() <a id="com.long" href="#com.long">&#x23;</a>
定义数值类型为 64 位整数，  
作为输入参数可兼容 .NET System.Int64 类型数值。  
参数 @1 可以为数值或数组，  
参数 @2 为 true 则用于 COM 输出引用参数。  

此函数返回 com.Variant 对象。

[返回对象:comVariantObject](#comVariantObject)

### com.toSafeArray(值,元素类型) <a id="com.toSafeArray" href="#com.toSafeArray">&#x23;</a>
转换为 COM 兼容数组，返回对象只能用于 COM 函数。  

1. 如果参数 @value 是 `buffer` 类型则直接返回，参数 @variantType 无效。  
2. 如果参数 @value 已经是 com.SafeArray 格式的 COM 数组则直接返回，参数 @variantType 无效。  
3. 如果参数 @value 是 `字符串` 则返回声明为 _VT_UI1 类型 COM 数组的包装对象，参数 @variantType 无效。   
4. 其他情况下返回 COM 数组的包装对象，value 只能指定表对象或者 null 值（将创建空数组）。  

可选用参数 @variantType 指定数组元素的 COM 变体类型。  
如果未指定 @variantType ，则默认设为 _VT_ILLEGAL （自动检测类型）。  
自动检测并设定类型规则：  
字符串数组设为 _VT_BSTR，数值数组设为 _VT_R8，COM 对象数组设为 _VT_DISPATCH，  
其他设为 _VT_VARIANT。  

com.toSafeArray 函数不受 com.SetPreferredArrayType 的设置影响。  
VBS 接口应将 @variantType 参数指定为 _VT_VARIANT，否则无法识别数组。

### com.ubyte() <a id="com.ubyte" href="#com.ubyte">&#x23;</a>
定义数值类型为 8 位无符号整数，兼容 .NET System.Byte 类型数值。  
参数 @1 可以为数值或数组，  
参数 @2 为 true 则用于 COM 输出引用参数。  

此函数返回 com.Variant 对象。

[返回对象:comVariantObject](#comVariantObject)

### com.uint() <a id="com.uint" href="#com.uint">&#x23;</a>
定义数值类型为 32 位无符号整数，  
作为输入参数可兼容 .NET System.UInt32 类型数值。  
参数 @1 可以为数值或数组，  
参数 @2 为 true 则用于 COM 输出引用参数。  

此函数返回 com.Variant 对象。

[返回对象:comVariantObject](#comVariantObject)

### com.ulong() <a id="com.ulong" href="#com.ulong">&#x23;</a>
定义数值类型为 64 位无符号整数，  
作为输入参数可兼容 .NET System.UInt64 类型数值。  
参数 @1 可以为数值或数组，  
参数 @2 为 true 则用于 COM 输出引用参数。  

此函数返回 com.Variant 对象。

[返回对象:comVariantObject](#comVariantObject)

### com.uword() <a id="com.uword" href="#com.uword">&#x23;</a>
定义数值类型为 16 位无符号整数，兼容 .NET System.UInt16 类型数值。  
参数 @1 可以为数值或数组，  
参数 @2 为 true 则用于 COM 输出引用参数。  

此函数返回 com.Variant 对象。

[返回对象:comVariantObject](#comVariantObject)

### com.word() <a id="com.word" href="#com.word">&#x23;</a>
定义数值类型为 16 位整数，  
作为输入参数可兼容 .NET System.Int16 类型数值。  
参数 @1 可以为数值或数组，  
参数 @2 为 true 则用于 COM 输出引用参数。  

此函数返回 com.Variant 对象。

[返回对象:comVariantObject](#comVariantObject)

## comEnumeratorObject 成员列表 <a id="comEnumeratorObject" href="#comEnumeratorObject">&#x23;</a>

### comEnumeratorObject.Clone() <a id="comEnumeratorObject.Clone" href="#comEnumeratorObject.Clone">&#x23;</a>
复制对象  

[返回对象:comEnumeratorObject](#comEnumeratorObject)

### comEnumeratorObject.Next(n) <a id="comEnumeratorObject.Next" href="#comEnumeratorObject.Next">&#x23;</a>
向后获取并返回 n 个元素的值

### comEnumeratorObject.Reset() <a id="comEnumeratorObject.Reset" href="#comEnumeratorObject.Reset">&#x23;</a>
重置到开始位置

### comEnumeratorObject.Skip(n) <a id="comEnumeratorObject.Skip" href="#comEnumeratorObject.Skip">&#x23;</a>
跳过 n 个元素的值,成功返回 true

## comTypeAttrObject 成员列表 <a id="comTypeAttrObject" href="#comTypeAttrObject">&#x23;</a>

### comTypeAttrObject.Funcs <a id="comTypeAttrObject.Funcs" href="#comTypeAttrObject.Funcs">&#x23;</a>
函数总数

### comTypeAttrObject.GUID <a id="comTypeAttrObject.GUID" href="#comTypeAttrObject.GUID">&#x23;</a>
`GUID`

### comTypeAttrObject.ImplTypes <a id="comTypeAttrObject.ImplTypes" href="#comTypeAttrObject.ImplTypes">&#x23;</a>
实现接口总数

### comTypeAttrObject.Vars <a id="comTypeAttrObject.Vars" href="#comTypeAttrObject.Vars">&#x23;</a>
属性值总数

### comTypeAttrObject.typekind <a id="comTypeAttrObject.typekind" href="#comTypeAttrObject.typekind">&#x23;</a>
类型,  
值为"coclass","enumeration","interface","dispinterface"  
"alias","union","record","module"之一

## comTypeAttrObject.flags 成员列表 <a id="comTypeAttrObject.flags" href="#comTypeAttrObject.flags">&#x23;</a>

### comTypeAttrObject.flags.appobject <a id="comTypeAttrObject.flags.appobject" href="#comTypeAttrObject.flags.appobject">&#x23;</a>
`appobject`

### comTypeAttrObject.flags.cancreate <a id="comTypeAttrObject.flags.cancreate" href="#comTypeAttrObject.flags.cancreate">&#x23;</a>
`cancreate`

### comTypeAttrObject.flags.control <a id="comTypeAttrObject.flags.control" href="#comTypeAttrObject.flags.control">&#x23;</a>
`control`

### comTypeAttrObject.flags.dispatchable <a id="comTypeAttrObject.flags.dispatchable" href="#comTypeAttrObject.flags.dispatchable">&#x23;</a>
`dispatchable`

### comTypeAttrObject.flags.hidden <a id="comTypeAttrObject.flags.hidden" href="#comTypeAttrObject.flags.hidden">&#x23;</a>
`hidden`

### comTypeAttrObject.flags.oleautomation <a id="comTypeAttrObject.flags.oleautomation" href="#comTypeAttrObject.flags.oleautomation">&#x23;</a>
`oleautomation`

## comTypeDocObject 成员列表 <a id="comTypeDocObject" href="#comTypeDocObject">&#x23;</a>

### comTypeDocObject.helpstring <a id="comTypeDocObject.helpstring" href="#comTypeDocObject.helpstring">&#x23;</a>
对象的描述

### comTypeDocObject.name <a id="comTypeDocObject.name" href="#comTypeDocObject.name">&#x23;</a>
对象接口名称

## comTypeFuncObject 成员列表 <a id="comTypeFuncObject" href="#comTypeFuncObject">&#x23;</a>

### comTypeFuncObject.Params <a id="comTypeFuncObject.Params" href="#comTypeFuncObject.Params">&#x23;</a>
参数数量

### comTypeFuncObject.ParamsOpt <a id="comTypeFuncObject.ParamsOpt" href="#comTypeFuncObject.ParamsOpt">&#x23;</a>
可选参数数量

### comTypeFuncObject.description <a id="comTypeFuncObject.description" href="#comTypeFuncObject.description">&#x23;</a>
描述

### comTypeFuncObject.dispatchable <a id="comTypeFuncObject.dispatchable" href="#comTypeFuncObject.dispatchable">&#x23;</a>
是否动态接口函数

### comTypeFuncObject.helpcontext <a id="comTypeFuncObject.helpcontext" href="#comTypeFuncObject.helpcontext">&#x23;</a>
数值，帮助上下文

### comTypeFuncObject.helpfile <a id="comTypeFuncObject.helpfile" href="#comTypeFuncObject.helpfile">&#x23;</a>
帮助

### comTypeFuncObject.invkind <a id="comTypeFuncObject.invkind" href="#comTypeFuncObject.invkind">&#x23;</a>
调用类型  
可能的值为"_get","_set","_setByRef","function"

### comTypeFuncObject.memid <a id="comTypeFuncObject.memid" href="#comTypeFuncObject.memid">&#x23;</a>
成员ID

### comTypeFuncObject.name <a id="comTypeFuncObject.name" href="#comTypeFuncObject.name">&#x23;</a>
函数名

### comTypeFuncObject.restricted <a id="comTypeFuncObject.restricted" href="#comTypeFuncObject.restricted">&#x23;</a>
是否不适合动态调用

### comTypeFuncObject.type <a id="comTypeFuncObject.type" href="#comTypeFuncObject.type">&#x23;</a>
返回值类型，字符串

### comTypeFuncObject.vt <a id="comTypeFuncObject.vt" href="#comTypeFuncObject.vt">&#x23;</a>
返回值类型，数值,  
数值含义与 com.Variant 对象的 vt 字段相同

## comTypeFuncObject.parameters 成员列表 <a id="comTypeFuncObject.parameters" href="#comTypeFuncObject.parameters">&#x23;</a>

参数描述数组

### comTypeFuncObject.parameters.* <a id="comTypeFuncObject.parameters.any" href="#comTypeFuncObject.parameters.any">&#x23;</a>
[返回对象:comTypeParameterObject](#comTypeParameterObject)

## comTypeInfoObject 成员列表 <a id="comTypeInfoObject" href="#comTypeInfoObject">&#x23;</a>

### comTypeInfoObject.DumpTypeInfo() <a id="comTypeInfoObject.DumpTypeInfo" href="#comTypeInfoObject.DumpTypeInfo">&#x23;</a>
返回一个字符串,  
列出此类型所有的成员

### comTypeInfoObject.GetDocumentation() <a id="comTypeInfoObject.GetDocumentation" href="#comTypeInfoObject.GetDocumentation">&#x23;</a>
返回文档信息  

[返回对象:comTypeDocObject](#comTypeDocObject)

### comTypeInfoObject.GetFuncDesc() <a id="comTypeInfoObject.GetFuncDesc" href="#comTypeInfoObject.GetFuncDesc">&#x23;</a>
[返回对象:comTypeFuncObject](#comTypeFuncObject)

### comTypeInfoObject.GetFuncDesc(索引) <a id="comTypeInfoObject.GetFuncDesc" href="#comTypeInfoObject.GetFuncDesc">&#x23;</a>
返回函数描述  
注意超始索引为1

### comTypeInfoObject.GetImplType() <a id="comTypeInfoObject.GetImplType" href="#comTypeInfoObject.GetImplType">&#x23;</a>
[返回对象:comTypeInfoObject](#comTypeInfoObject)

### comTypeInfoObject.GetImplType(索引) <a id="comTypeInfoObject.GetImplType" href="#comTypeInfoObject.GetImplType">&#x23;</a>
返回实现接口  
注意超始索引为1

### comTypeInfoObject.GetImplTypeFlags(索引) <a id="comTypeInfoObject.GetImplTypeFlags" href="#comTypeInfoObject.GetImplTypeFlags">&#x23;</a>
实现接口类型属性表  
返回表包含字段default,source,restricted,defaultVTable,都是布尔值,  
注意超始索引为1

### comTypeInfoObject.GetTypeAttr() <a id="comTypeInfoObject.GetTypeAttr" href="#comTypeInfoObject.GetTypeAttr">&#x23;</a>
返回类型属性  

[返回对象:comTypeAttrObject](#comTypeAttrObject)

### comTypeInfoObject.GetTypeLib() <a id="comTypeInfoObject.GetTypeLib" href="#comTypeInfoObject.GetTypeLib">&#x23;</a>
返回类型库  

[返回对象:comTypeLibObject](#comTypeLibObject)

### comTypeInfoObject.GetVarDesc(索引) <a id="comTypeInfoObject.GetVarDesc" href="#comTypeInfoObject.GetVarDesc">&#x23;</a>
COM变量/常量描述  
注意超始索引为1

## comTypeLibObject 成员列表 <a id="comTypeLibObject" href="#comTypeLibObject">&#x23;</a>

### comTypeLibObject.ExportConstants() <a id="comTypeLibObject.ExportConstants" href="#comTypeLibObject.ExportConstants">&#x23;</a>
导出常量名值对组成的表。  
可以使用常量名作为 COM 对象的成员名获取常量值

### comTypeLibObject.ExportEnumerations() <a id="comTypeLibObject.ExportEnumerations" href="#comTypeLibObject.ExportEnumerations">&#x23;</a>
导出全部枚举类型，  
返回一个表，键为枚举类型名，值为该类型的枚举名值对组成的表。  

通常枚举名值对也是 COM 常量名值对，  
可以使用枚举名字（不用指定枚举类型名）  
作为 COM 对象的成员名获取枚举值

### comTypeLibObject.GetDocumentation() <a id="comTypeLibObject.GetDocumentation" href="#comTypeLibObject.GetDocumentation">&#x23;</a>
返回文档信息  

[返回对象:comTypeDocObject](#comTypeDocObject)

### comTypeLibObject.GetTypeInfo() <a id="comTypeLibObject.GetTypeInfo" href="#comTypeLibObject.GetTypeInfo">&#x23;</a>
[返回对象:comTypeInfoObject](#comTypeInfoObject)

### comTypeLibObject.GetTypeInfo(索引) <a id="comTypeLibObject.GetTypeInfo" href="#comTypeLibObject.GetTypeInfo">&#x23;</a>
返回类型信息  
注意超始索引为1

### comTypeLibObject.GetTypeInfoCount() <a id="comTypeLibObject.GetTypeInfoCount" href="#comTypeLibObject.GetTypeInfoCount">&#x23;</a>
类型信息总数

### comTypeLibObject.ShowHelp() <a id="comTypeLibObject.ShowHelp" href="#comTypeLibObject.ShowHelp">&#x23;</a>
显示帮助

## comTypeParameterObject 成员列表 <a id="comTypeParameterObject" href="#comTypeParameterObject">&#x23;</a>

### comTypeParameterObject.default <a id="comTypeParameterObject.default" href="#comTypeParameterObject.default">&#x23;</a>
参数的默认值

### comTypeParameterObject.in <a id="comTypeParameterObject.in" href="#comTypeParameterObject.in">&#x23;</a>
是否输入参数

### comTypeParameterObject.opt <a id="comTypeParameterObject.opt" href="#comTypeParameterObject.opt">&#x23;</a>
是否可选参数

### comTypeParameterObject.out <a id="comTypeParameterObject.out" href="#comTypeParameterObject.out">&#x23;</a>
是否输出参数

### comTypeParameterObject.type <a id="comTypeParameterObject.type" href="#comTypeParameterObject.type">&#x23;</a>
参数类型，字符串

### comTypeParameterObject.vt <a id="comTypeParameterObject.vt" href="#comTypeParameterObject.vt">&#x23;</a>
参数类型，数值,  
数值含义与 com.Variant 对象的 vt 字段相同

## comTypeVarObject 成员列表 <a id="comTypeVarObject" href="#comTypeVarObject">&#x23;</a>

### comTypeVarObject.name <a id="comTypeVarObject.name" href="#comTypeVarObject.name">&#x23;</a>
COM变量名

### comTypeVarObject.value <a id="comTypeVarObject.value" href="#comTypeVarObject.value">&#x23;</a>
COM常量值

## comVariantObject 成员列表 <a id="comVariantObject" href="#comVariantObject">&#x23;</a>

### comVariantObject.bstrVal <a id="comVariantObject.bstrVal" href="#comVariantObject.bstrVal">&#x23;</a>
只读属性,获取BSTR指针

### comVariantObject.clear() <a id="comVariantObject.clear" href="#comVariantObject.clear">&#x23;</a>
清空值  
调用VariantClear函数清空值并重新初始化对象  
调用了此函数以后,对象的vt置为0，  
其他所有成员置为null，包括clear函数也置为null，  
除非通过value属性重新赋值,clear函数才会变为可用  

即使不调用这个函数，  
aardio在析构回收对象时也会自动调用VariantClear函数释放资源

### comVariantObject.parray <a id="comVariantObject.parray" href="#comVariantObject.parray">&#x23;</a>
只读属性,获取SAFEARRAY指针

### comVariantObject.pdispVal <a id="comVariantObject.pdispVal" href="#comVariantObject.pdispVal">&#x23;</a>
只读属性,获取IDispatch指针

### comVariantObject.punkVal <a id="comVariantObject.punkVal" href="#comVariantObject.punkVal">&#x23;</a>
只读属性,获取IUnknown指针

### comVariantObject.value <a id="comVariantObject.value" href="#comVariantObject.value">&#x23;</a>
读写值遵守com与aardio间的数据类型转换规则

### comVariantObject.vt <a id="comVariantObject.vt" href="#comVariantObject.vt">&#x23;</a>
Variant类型，数值，  
只读属性，不可修改

## embedObject 成员列表 <a id="embedObject" href="#embedObject">&#x23;</a>

### embedObject._form <a id="embedObject._form" href="#embedObject._form">&#x23;</a>
COM 对象的容器窗口。  
这是一个 win.form 对象或者 win.form 对象内部的控件对象。  

[返回对象:staticObject](https://www.aardio.com/zh-cn/docs/library-reference/win/ui/ctrl/static.html#staticObject)

### embedObject._object <a id="embedObject._object" href="#embedObject._object">&#x23;</a>
原生 COM 控件对象。  
原生 COM 控件对象不等于事件监听表，一般不用于直接绑定 COM 事件。  
应当用 com.Connect 绑定事件监听表。  
CreateEmbedEx 或 CreateEmbed 返回的容器对象也可自动绑定 COM 事件。

## embedObject._host 成员列表 <a id="embedObject._host" href="#embedObject._host">&#x23;</a>

COM 控件宿主对象。  
提供部分 OLE 接口函数，一般没必要直接使用这个对象。

### embedObject._host._adjust() <a id="embedObject._host._adjust" href="#embedObject._host._adjust">&#x23;</a>
自动调整控件窗口大小

### embedObject._host.close() <a id="embedObject._host.close" href="#embedObject._host.close">&#x23;</a>
关闭

### embedObject._host.doObjectVerb( _OLEIVERB ) <a id="embedObject._host.doObjectVerb" href="#embedObject._host.doObjectVerb">&#x23;</a>
执行指定的动词命令

### embedObject._host.tranacc(MSG消息对象) <a id="embedObject._host.tranacc" href="#embedObject._host.tranacc">&#x23;</a>
解析快捷键,  
如果是快捷键返回真值
