从 COM 对象检索类型信息.
VarType := ComObjType(ComObj) IName := ComObjType(ComObj, "Name") IID := ComObjType(ComObj, "IID") CName := ComObjType(ComObj, "Class") CLSID := ComObjType(ComObj, "CLSID")
返回值取决于 Param2 的值:
Param2 | 返回类型 | 返回值 |
---|---|---|
省略 | 整数 | 变体类型码表示 COM 包装器对象包含的值的类型. |
"Name" |
字符串 | 对象默认接口的名称. |
"IID" |
字符串 | 对象默认接口的全局唯一标识符(GUID). |
"Class" |
字符串 | 对象的类名. 注意, 这不同于 Prog ID(Prog ID 是用于在系统注册表或 ComObject 中标识类的名称). |
"CLSID" |
字符串 | 对象的类的全局唯一标示符(GUID). 类通常由 CLSID 在 HKCR\CLSID 注册表项下注册. |
如果参数无效或无法检索请求的类型信息, 则返回空字符串.
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 对象包装器.
如果 Param2 是 "Name"
或 "IID"
, 则通过 IDispatch::GetTypeInfo 接口方法检索类型信息. ComObj 的变体类型必须是 VT_DISPATCH.
如果 Param2 是 "Class"
或 "CLSID"
, 则通过 IProvideClassInfo::GetClassInfo 接口方法检索类型信息. ComObj 的变体类型必须是 VT_DISPATCH 或 VT_UNKNOWN, 该对象必须实现 IProvideClassInfo 接口(有些对象没有实现).
ComObjValue, ComValue, ComObject, ComObjGet, ComObjActive