我有一个进程外的ATL COM服务器(exe)。当客户端启动它时,服务器会生成一个工作线程,该线程会轮询某些数据。每次更新数据时,我都想通知所有客户端更新的值。
我创建了一个COM客户端,通过CoCreateInstanceEx连接,创建其Sink对象,获取连接点并调用Advise,所有这些都没有错误。但是,当服务器尝试Fire_event时,它的IConnectionPointImpl :: m_vec为空,并且不会通知任何客户端。
我认为这是因为服务器创建了自己的对象,因此我最终得到了两个IConnectionPointImpl :: m_vec实例,一个来自服务器,一个来自客户端,当它调用Advise时。如何将服务器数据提供给客户端?
答案 0 :(得分:0)
我推荐这种方法。创建一个简单的vanilla C ++单例(不是COM对象) - 让我们称之为S
。 S
将包含一个对所有未完成的COM对象的弱{non AddRef
'ed引用列表(C ++类指针,而不是COM接口指针,将是方便的)。您的COM对象将在其构造函数中使用S
注册自己,并在析构函数中注销。
当一些有趣的事情发生时,你的工作线程会通知(调用方法)S
,这会通知所有已注册的COM对象,这些对象会自己调用Fire_event
。
从工作线程触发事件时要小心。这是非法的,除非您的主线程和工作线程都进入MTA。有关详细信息和一些解决方法,请参阅http://vcfaq.mvps.org/com/1.htm。