2013-10-22 126 views
0

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

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

我认为这是因为服务器创建自己的对象,所以我最终得到两个IConnectionPointImpl :: m_vec实例,一个来自服务器,另一个来自客户端调用Advise时。我怎样才能获得服务器数据给客户端?

+1

我想你必须找出事件为什么被触发的对象不同于为客户端创建的对象,以及为什么有多个对象放在首位。 – sharptooth

回答

0

我推荐这种方法。创建一个普通的香草C++单例(不是COM对象) - 我们称之为S。对于所有未完成的COM对象(C++类指针,而不是COM接口指针,将会很方便),将引用弱引用列表。你的COM对象将在其构造函数中注册为S,并在析构函数中注销。

当一些有趣的事情发生时,你的工作线程会通知(调用一个方法)S,它会通知所有已注册的COM对象,它们自己会调用Fire_event

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