【问题标题】:How to implement event dispatching from a Windows Script host to a script如何实现从 Windows 脚本主机到脚本的事件分派
【发布时间】:2020-03-23 11:39:55
【问题描述】:

我有一个使用 Visual C++ 2019 构建的 C++ COM(多线程单元模型)应用程序。我正在使用基于 COM 的 Active Script 接口和类。我创建并设置了一个 JavaScript(“JScript”,CLSID {F414C260-6AC0-11CF-B6D1-00AA00BBBB58})Active Script COM 对象。一切都运行得非常好(不幸的是,对于一些默默无闻的东西)。

是否有一种惯用的方法来注册和调用事件侦听器,其中脚本可以使用像 https://dom.spec.whatwg.org/#dom-eventtarget-addeventlistener 这样的 API,并且我可以从脚本主机 (C++) 分派事件?澄清一下,我可以从脚本中调用IDispatch 接口方法,我想从程序中调用之前使用此类方法传递给程序的脚本函数。 GetScriptDispatch 是另外一回事——它允许我调用全局脚本命名空间中可用的方法,但我需要调用传递给代理(来自脚本)“addEventListener”方法的函数。

我依赖这个功能是因为我想分派事件。基本上,我希望 addEventListener 在某些代理对象上可用(例如,使用 AddNamedItem 添加到脚本命名空间的对象)对象,并且当 C++ 应用程序中的某些事件发生时,我需要调用通过调用该方法添加的事件侦听器。

我已经阅读了一些关于IConnectionPoint 的内容,Active Script 文档曾多次简要提到“事件接收器”,但没有提供有关如何使用它们以及用于什么用途的示例。还有IBindEventHandler这个接口,不用再多解释是干什么用的了。

我知道这是古老的东西,但我喜欢 COM,并且 Active Script 接口有几个实现,这对我来说增加了实用性。

【问题讨论】:

    标签: c++ winapi com event-handling iactivescript


    【解决方案1】:

    您需要创建一个实现事件的对象(请参阅IConnectionPoint)。

    启动脚本后,您可以调用AddNamedItem。该脚本现在知道您对象的接口。如果它实现了它可以在状态更改为SCRIPTSTATE_CONNECTED 时注册到此事件。

    如果触发事件,脚本将接收该事件并执行相应的代码部分。

    有旧样本:

    • Q168214 示例:MFAXS(您可能会在 Wayback 引擎中找到它)
    • code project 中有一个示例
    • 有关事件的 ATL 示例,请查看 here

    【讨论】:

    • 谢谢你!好吧,即使我实现了IConnectionPoint 和相关接口,究竟是什么让我能够识别支持addEventListenerdispatchEventEvent 的脚本对象并使用这些API?你能详细说明一下吗? Active Script 是否会在 IDispatchIConnectionPoint 的任何对象上神奇地实现 addEventListener 和/或 dispatchEvent(例如)?
    • 我无法详细告诉您脚本引擎做了什么。只需调试我给您的其中一个示例。我可以告诉你它很容易工作。
    猜你喜欢
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    相关资源
    最近更新 更多