# ComObjType() [AHK_L 53+]

从 COM 对象获取类型信息.

    VarType := ComObjType(ComObject)           ; 需要 [v1.0.91+]
    Name    := ComObjType(ComObject, "Name")
    IID     := ComObjType(ComObject, "IID")
    Class   := ComObjType(ComObject, "Class")  ; 需要 [v1.1.26+]
    CLSID   := ComObjType(ComObject, "CLSID")  ; 需要 [v1.1.26+]

## 参数

ComObject

  包含 COM 对象或类型化值的包装器对象.

参数2

  第二个参数是指示返回的类型信息的字符串.

## 返回值

返回值依赖于 参数2 的值:

参数2 | 返回值
--- | ---
省略 | [v1.0.91+]: 整数变量类型码, 其指示了 COM 包装器对象包含的值的类型.
`"Name"` | 对象默认接口的名称.
`"IID"` | 对象默认接口的全局唯一标识符(GUID).
`"Class"` | [v1.1.26+]: 对象的类名. 请注意, Class 与 Prog ID 是不一样的(Prog ID 是一个在系统注册表或 ComObjCreate 中用于识别的类名称).
`"CLSID"` | [v1.1.26+]: 对象的类的全局唯一标示符(GUID). 类经常以 CLSID 的形式注册, 位于 `HKCR\CLSID` 注册表键下.

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

## 变量类型的常量值

    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 对象包装器.

如果 参数2 是 `"Name"` 或 `"IID"`, 类型信息是通过 IDispatch::GetTypeInfo 接口方法取回的. ComObject 的变量类型必须是 VT_DISPATCH.

如果 参数2 是 `"Class"` 或 `"CLSID"`, 类型信息是通过 IProvideClassInfo::GetClassInfo 接口方法取回的. ComObject 的变量类型必须是 VT_DISPATCH 或 VT_UNKNOWN, 并且对象必须执行 iprovideclassinfo 接口 (一些对象不需要).

## 相关

ComObjValue(), ComObjCreate(), ComObjGet(), ComObjActive()

## 示例

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

    d := ComObjCreate("Scripting.Dictionary")
    VarType := ComObjType(d)          ; 对于可脚本化对象总为 9.
    Name    := ComObjType(d, "Name")  ; 仅对于可脚本化对象有效.
    IID     := ComObjType(d, "IID")   ; 同上.
    CName   := ComObjType(d, "Class")  ; 需要 [v1.1.26+]
    CLSID   := ComObjType(d, "CLSID")  ; 需要 [v1.1.26+]
    MsgBox % "变量类型:`t" VarType
    	. "`n接口名称:`t" Name "`n接口 IID:`t" IID
    	. "`n类名:`t" CName "`n类标识符(CLSID):`t" CLSID

dftg