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
}
unixetc