0

我有一个进程外的 ATL COM 服务器 (exe)。当它由客户端启动时,服务器会产生一个工作线程来轮询一些数据。每次更新数据时,我都想用更新后的值通知所有客户端。

我创建了一个 COM 客户端,它通过 CoCreateInstanceEx 连接,创建它的 Sink 对象,获取连接点并调用 Advise,所有这些都没有错误。但是,当服务器尝试 Fire_event 时,它的 IConnectionPointImpl::m_vec 是空的,并且不会通知任何客户端。

我假设这是因为服务器创建了自己的对象,所以我最终得到了两个 IConnectionPointImpl::m_vec 实例,一个来自服务器,一个来自客户端,当它调用 Advise 时。如何将服务器数据发送给客户端?

4

1 回答 1

0

我推荐这种方法。创建一个普通的 C++ 单例(不是 COM 对象)——我们称之为S. S将保存一个对所有未完成的 COM 对象的弱的、非AddRef'ed 引用的列表(一个 C++ 类指针,而不是一个 COM 接口指针,会很方便)。您的 COM 对象将S在其构造函数中注册自己,并在析构函数中取消注册。

当有趣的事情发生时,您的工作线程会通知(调用方法)S,这会通知所有注册的 COM 对象,这些对象会调用Fire_event自己。

从工作线程触发事件时要小心。这是非法的,除非您的主线程和工作线程都进入 MTA。有关详细信息和一些解决方法,请参阅http://vcfaq.mvps.org/com/1.htm

于 2013-10-22T20:34:46.013 回答