如何编写具有异步事件触发的 C++ COM 对象(如 VB6 的 Timer 对象)?

How can I write a C++ COM object with asynchronous event firing (like VB6's Timer object)?

我正在通过 ReadDirectoryChangesW 为目录更改通知编写 C++ COM 对象。我的对象中的一个线程将等待更改,然后通知 VB6 客户端。

我知道如何从我的程序的主线程触发事件,类似于回调函数,但我不想强迫用户每隔一小段时间就轮询我的对象以获取更改。

据我所知,我想要的可以通过发送 window 消息来完成,但这需要在 VB6 端进行表单子类化,这非常复杂。

所以我正在寻找一种方法来编写像 VB6 的 Timer 这样的对象,即使 VB6 当前未调用 Timer 的方法,它也可以在 VB6 中触发事件。这可能吗?

COM 事件。

这个话题比较费力,它意味着定义一个'sink'事件消费者(VB)传递给事件源的接口,然后通过调用[=上的方法引发事件25=] 界面。参见 Architecture of Connectable Objects. You must implement IConnectionPointContainer。好消息是 IDE 完全了解此模型,并将在 VB 设计器中公开您的事件。从 VB 端只需双击 COM 对象 'events' 属性面板即可。

至于 'async' 部分,这属于组件的 'threading' 模型和 VB 宿主应用程序。在单元线程(默认)中,您必须在主单元线程中引发事件,并且您可能 必须编组线程之间的接口。参见 What are the rules for CoMarshalInterface and CoUnmarshalInterface?

有关从 C++ 服务器到 VB6 客户端的异步 COM 事件触发的详细信息,请参阅 this article