我有多个客户程序,调用同一个com对象,com 对象有连接点机制,我想一旦有事情发生时,通知所有客户程序我应该怎么做???

解决方案 »

  1.   

    我应用了事件,但是只有创建com对象的客户能接受事件,也就是说客户之间是隔离的,我想实现 一旦有事件产生,com就通知所有的客户
      

  2.   

    to skybblue(天蓝) :
     我曾经试着把组件加入com 组件管理器,应该就是进程外调用的方式了,但是还是不行,不知道atl 有没有记录所有连接到com对象的模板?
      

  3.   

    你不用把组件加到Com+组件管理器,你可以生成一个可执行的服务器组件,这样不管有多少个客户端都只会有一个服务器组件进程实例,而没有服务器组件对象的创建都会在该实例进程中创建和管理!
      

  4.   

    做进程外组件,用DECLARE_CLASSFACTORY_SINGLETON声明类工厂,
    这样就是单实例的组件,这样就可以了
    但如果在一个服务里使用,又在前台使用,还是不能做到单实例
      

  5.   

      呵呵~~
      COM的事件模型说的不是你想的那个意思~
      
      但只要保证组件对象的单一
      那么就可实现你的想法.
      针对你的客户是什么,有两种思路~~
        可参考一下:
      http://expert.csdn.net/Expert/topic/1667/1667651.xml?temp=.8482935  
     
      

  6.   

    MSDN中有一个DCom的示例,类似于Netmeeting的共享白板,在一个客户中绘的图形会被服务器广播到所有其他客户中。可以研究一下,不知是否会对你有所启发。
      

  7.   

    有两种方法:
    方法一、在服务器端记录下每一个被创建的服务器对象的指针,等到有事件发生时,找到每一个服务器对象的指针,然后调用该服务器对象指针的方法触发相应的事件。
    方法二、在客户端进行实现事件接收器与连接点对象进行绑定的时候,首先查找先前创建的事件接收器对象的指针,如果找到,则把该接收器的指针直接与连接点对象进行绑定,否则需要创建一个新的接收器对象并与连接点对象进行绑定。这样当有多个客户端的时候,每一个连接点对象都与一个接收器对象进行绑定。因此,当有事件发生的时候,每一个客户端都会接收到该事件。楼上说的MSDN中的Dcom示例就使用这种方法。
      

  8.   

    上次的第二种方法不正确,应该改为在服务器对象的实现类中使用DECLARE_CLASSFACTORY_SINGLETON()宏,这样当有事件发生的时候,每一个对象都会的事件处理函数都会被调用,这样所有的客户端都会被通知。
      

  9.   

    你看一下这篇文章就知道该怎么实现了!
    http://expert.csdn.net/Expert/topic/1701/1701466.xml?temp=.6448328
      

  10.   

    最简单的方法是使用COM+的PUBLISHER功能,POOLED的ACTIVED、DEACTIVED函数!使用DECLARE_CLASSFACTORY_SINGLETON(),要注意,虽然这样可以保证对象唯一,但要使用多线程实现异步调用,比较麻烦,还是使用COM+的异步消息发布,比较EASY