# ComObjConnect

将 COM 对象的事件源连接到具有给定前缀的函数.

    ComObjConnect ComObj , Prefix

## 参数

ComObj

  类型: ComObject

  产生事件的对象.

  如果对象不支持 IConnectionPointContainer 接口, 或无法获取对象类的类型信息, 将显示一条错误信息. 可通过 try/catch 禁止或处理此错误信息.

  如果对象支持, 使用 IProvideClassInfo 接口以接收此对象类的类型信息. 否则, ComObjConnect 尝试通过对象的 IDispatch 接口以接收类型信息, 这可能不可靠.

Prefix

  类型: 字符串或对象

  当事件发生时, 用于确定调用哪个函数的前缀字符串.

  如果省略, 则对象为 "disconnected"; 即脚本将不再接收其事件通知.

  此参数可以为脚本定义的对象. 事件发生时, 会调用相应的方法. 首个参数, 通常为隐式传递的参数 `this`, 其引用脚本定义的对象, 而非 COM 对象. 要捕获所有事件, 而又不想为每个事件定义方法, 可定义 __Call 元函数.

## 用法

为了有效地使用 ComObjConnect, 您必须首先在脚本中编写函数来处理任何感兴趣的事件. 这些函数或 "事件处理程序", 具有下列结构:

    PrefixEventName([Params..., ComObj])
    {
        ... 事件处理代码 ...
        return ReturnValue
    }

Prefix 为用户定义的前缀, 而 EventName 是函数应该处理的任何事件的名称.

Params 对应于事件拥有的任何参数. 如果事件没有参数, 则应该完全忽略 Params. ComObj 是一个额外的参数, 它包含对传递给 ComObjConnect 的原始封装对象的引用, 它从未被包含在 COM 事件的文档中. "ComObj" 应该替换为在您的脚本上下文中更有意义的名称.

注意, 事件处理程序可能有返回值. 要返回特定的 COM 类型的值, 使用 ComValue(type, value). 例如, `return ComValue(0,0)` 返回一个 VT_EMPTY 类型的变体, 相当于从一个 JavaScript 函数返回 `undefined`(或没有返回).

调用 `ComObjConnect(yourObject, "Prefix")` 来启用事件处理.

调用 `ComObjConnect(yourObject)` 来断开对象(停止处理事件).

如果参数的数目未知, 可以使用可变参数函数.

## 备注

脚本必须保留对 ComObj 的引用, 否则它将自动释放, 并与其 COM 对象断开连接, 从而阻止任何进一步的事件被检测到. 没有标准的方法来检测何时不再需要连接, 所以脚本必须通过调用 ComObjConnect 手动断开连接.

可能需要使用 Persistent 函数, 以便在脚本监听事件时保持脚本运行.

失败时抛出异常.

## 相关

ComObject, ComObjGet, ComObjActive, WScript.ConnectObject (MSDN)

## 示例

启动 Internet Explorer 的实例, 并将事件连接到相应的前缀为 "IE_" 的脚本函数. 有关 COM 对象和下面使用的 DocumentComplete 事件的详情, 请参阅 InternetExplorer object (Microsoft Docs).

    ie := ComObject("InternetExplorer.Application")

    ; 将事件连接到相应的 "IE_" 为前缀的脚本函数.
    ComObjConnect(ie, "IE_")

    ie.Visible := true  ; 此语句在 IE7 中无法正常执行.
    ie.Navigate("https://www.autohotkey.com/")
    Persistent

    IE_DocumentComplete(ieEventParam, url, ieFinalParam) {
        s := ""
        if (ie != ieEventParam)
            s .= "First parameter is a new wrapper object.`n"
        if (ie == ieFinalParam)
            s .= "Final parameter is the original wrapper object.`n"
        if (ComObjValue(ieEventParam) == ComObjValue(ieFinalParam))
            s .= "Both wrapper objects refer to the same IDispatch instance.`n"
        MsgBox s . "Finished loading " ie.Document.title " @ " url
        ie.Quit()
        ExitApp
    }

dftg