我正在编写一个C++ COM对象,用于通过ReadDirectoryChangesW
进行目录更改通知。我对象中的线程将等待更改,然后通知VB6客户端。
我知道如何从程序的主线程触发事件,类似于回调函数,但是我不想强制用户每隔很小的时间间隔轮询我的对象是否有更改。
据我所知,我想要的可以通过发送窗口消息来完成,但这需要在VB6端进行子类化,这非常复杂。
因此,我正在寻找一种写像VB6的Timer
这样的对象的方法,即使VB6当前未调用Timer
方法,该对象也可以在VB6中触发事件。这可能吗?
最佳答案
COM事件。
该主题非常费力,它意味着定义事件使用者(VB)传递给事件源的“接收器”接口(interface),然后通过在“沉没”接口(interface)上调用方法来引发事件。参见Architecture of Connectable Objects。您必须实现 IConnectionPointContainer
。好消息是,IDE完全了解此模型,并将在VB设计器中公开您的事件。从VB方面,只需双击COM对象的“事件”属性面板。
至于“异步”部分,这属于组件和VB主机应用程序的“线程”模型。在Apartment线程(默认)中,您将必须在Apartment主线程中引发事件,并且可能必须封送线程之间的接口(interface)。参见What are the rules for CoMarshalInterface and CoUnmarshalInterface?。
有关从C++服务器到VB6客户端的异步COM事件触发的详细信息,可以在this article中找到。
关于c++ - 如何编写带有异步事件触发的C++ COM对象(如VB6的Timer对象)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36042463/