ComObjType

从 COM 对象检索类型信息.

Info := ComObjType(ComObj , InfoType)

参数

ComObj

类型: Object

包含 COM 对象或类型化值的包装器对象. 有关详情, 请参阅 ComValue.

InfoType

类型: 字符串

如果省略, 整数变量类型码, 其指示了 COM 包装器对象所包含的值的类型. 否则, 请指定以下字符串之一, 指示要检索的类型信息:

Name: 对象默认接口的名称.

IID: 对象默认接口的全局唯一标识符(GUID).

Class: 对象的类名. 注意, 这不同于 Prog ID(Prog ID 是用于在系统注册表或 ComObject 中标识类的名称).

CLSID: 对象的类的全局唯一标示符(GUID). 类通常由 CLSID 在 HKCR\CLSID 注册表项下注册.

返回值

类型: 整数字符串

返回值依赖于 InfoType 的值. 如果参数无效或指定的类型信息无法取回, 则返回空字符串.

Variant(变体) 类型常量

COM 使用以下值来识别基本数据类型:

VT_EMPTY     :=      0  ; 未指定值
VT_NULL      :=      1  ; 类似 SQL 中的空值
VT_I2        :=      2  ; 16 位有符号整数
VT_I4        :=      3  ; 32 位有符号整数
VT_R4        :=      4  ; 32 位浮点数
VT_R8        :=      5  ; 64 位浮点数
VT_CY        :=      6  ; 货币
VT_DATE      :=      7  ; 日期
VT_BSTR      :=      8  ; COM 字符串(带长度前缀的 Unicode 字符串)
VT_DISPATCH  :=      9  ; COM 对象
VT_ERROR     :=    0xA  ; 错误码(32 位整数)
VT_BOOL      :=    0xB  ; 布尔值: 真(-1) 或假(0)
VT_VARIANT   :=    0xC  ; VARIANT(必须与 VT_ARRAY 或 VT_BYREF 组合使用)
VT_UNKNOWN   :=    0xD  ; IUnknown 接口指针
VT_DECIMAL   :=    0xE  ; 小数(不支持)
VT_I1        :=   0x10  ; 8 位有符号整数
VT_UI1       :=   0x11  ; 8 位无符号整数
VT_UI2       :=   0x12  ; 16 位无符号整数
VT_UI4       :=   0x13  ; 32 位无符号整数
VT_I8        :=   0x14  ; 64 位有符号整数
VT_UI8       :=   0x15  ; 64 位无符号整数
VT_INT       :=   0x16  ; 有符号机器整数
VT_UINT      :=   0x17  ; 无符号机器整数
VT_RECORD    :=   0x24  ; 用户定义的类型 -- 不支持
VT_ARRAY     := 0x2000  ; SAFEARRAY
VT_BYREF     := 0x4000  ; 指向另一种类型值的指针
/*
 VT_ARRAY 和 VT_BYREF 与另一个值组合使用(使用按位或)
 以表示最终的类型. 例如, 0x2003 表示 32 位有符号整数的 SAFEARRAY, 而 0x400C 表示指向 VARIANT 的指针.
*/

一般说明

在大多数情况下, 来自 COM 对象的方法或属性的返回值会被转换为 AutoHotkey 支持的适当数据类型. 没有特别处理的类型通过 VariantChangeType 强制转换为字符串; 如果失败或者如果变量类型包含 VT_ARRAY 或 VT_BYREF 标志, 则返回一个同时包含值和类型的对象.

对于任意变量 x, 如果 ComObjType(x) 返回一个整数, 则 x 包含一个 COM 对象包装器.

如果 InfoType"Name""IID", 则通过 IDispatch::GetTypeInfo 接口方法检索类型信息. ComObj 的变体类型必须是 VT_DISPATCH.

如果 InfoType"Class""CLSID", 则通过 IProvideClassInfo::GetClassInfo 接口方法检索类型信息. ComObj 的变体类型必须是 VT_DISPATCH 或 VT_UNKNOWN, 该对象必须实现 IProvideClassInfo 接口(有些对象没有实现).

ComObjValue, ComValue, ComObject, ComObjGet, ComObjActive

示例

报告 COM 对象的各种类型信息.

d := ComObject("Scripting.Dictionary")
MsgBox
(
    "Variant type:`t" ComObjType(d) "
    Interface name:`t" ComObjType(d, "Name") "
    Interface ID:`t" ComObjType(d, "IID") "
    Class name:`t" ComObjType(d, "Class") "
    Class ID (CLSID):`t" ComObjType(d, "CLSID")
)