OOP COM 服务器更新客户端
Posted
技术标签:
【中文标题】OOP COM 服务器更新客户端【英文标题】:OOP COM Server Updates clients 【发布时间】:2013-10-30 21:25:25 【问题描述】:我有一个进程外的 ATL COM 服务器 (exe)。当它由客户端启动时,服务器会产生一个工作线程来轮询一些数据。每次更新数据时,我都想通知所有客户端更新值。
我创建了一个 COM 客户端,它通过 CoCreateInstanceEx 连接,创建它的 Sink 对象,获取连接点并调用 Advise,所有这些都没有错误。但是,当服务器尝试 Fire_event 时,它的 IConnectionPointImpl::m_vec 是空的,并且不会通知任何客户端。
我假设这是因为服务器创建了自己的对象,所以我最终得到了两个 IConnectionPointImpl::m_vec 实例,一个来自服务器,一个来自客户端,当它调用 Advise 时。如何将服务器数据发送给客户端?
【问题讨论】:
我想您必须找出为什么在与为客户端创建的对象不同的对象上触发事件,以及为什么首先有多个对象。 【参考方案1】:我推荐这种方法。创建一个普通的 C++ 单例(不是 COM 对象)——我们称之为S
。 S
将保存对所有未完成的 COM 对象的弱的、非 AddRef
的引用列表(使用 C++ 类指针而不是 COM 接口指针会更方便)。您的 COM 对象将在其构造函数中使用 S
注册自己,并在析构函数中取消注册。
当有趣的事情发生时,您的工作线程将通知(调用方法)S
,这将通知所有已注册的 COM 对象,这些对象将自己调用 Fire_event
。
从工作线程触发事件时要小心。这是非法的,除非您的主线程和工作线程都进入 MTA。有关详细信息和一些解决方法,请参阅 http://vcfaq.mvps.org/com/1.htm。
【讨论】:
以上是关于OOP COM 服务器更新客户端的主要内容,如果未能解决你的问题,请参考以下文章