COM+的事件订阅分两种:永久的和短暂的。
通过COM+管理程序增加的事件订阅属于前者,每次激发事件时要创建一个新的实例。
像你这种情况应该使用短暂型的事件订阅,通过COM+ Catalog的接口IEventSubscription增加订阅信息即可。

解决方案 »

  1.   

    能够说的详细点呢?谢谢
    或者,除了MSDN以外,还有哪里可以找到这些系统接口的编程使用方法呢?
    如果有,请给我EMAIL吧。感激涕零。 [email protected]
      

  2.   

    关于COM Catalog的编程说明可以从比较新的MSDN-Library中查到,我可以确认在99年时月份的MSDN-Library以及MS的MSDN网站(http://msdn.microsoft.com/)上包括这些信息。
    路径为:
    MSDN-Library
        Platform SDK
            Component Services
                Reference
      

  3.   

    另外,我发现Fire事件后,事件的发起者总是同步地等到事件的订阅者完成后才返回,
    多订阅者并行时要等到最后一个完成,这样如果一个订阅者阻塞会不会造成事件的发起者
    阻塞?怎么解决呢?
    因为我想需要做到这样:事件源异步地Fire事件,而不会因为订阅者僵死而阻塞,事件
    在一定时间内未被处理应被系统抛弃。这样的话会需要一种事件缓冲的机制,不知道
    COM+事件系统怎么解决呢?
      

  4.   

    缺省情况就是这样的,但是你可以改变这种行为:
    (1)订阅事件时有一个“Fire In Parallel”标记可以使多个事件并行进行,COM+采用多线程实现,但不保证顺序。
    (2)把COM+的事件机制和异步机制结合起来,把事件类标记成QC组件。
    其实你用了(2)就可以不用(1)了。
    看起来你的应用很先进,已经用上COM+了,而且还用到了这些新的特性。难得。
      

  5.   

    如何将组件标记为QC呢?我在事件类接口声明中写了QUEUEABLE结果vc不认。
    COM+组件管理中也没有找到如何将事件类标记为QC。
    还有,事件类的线程模式采用何种最好呢?
    另外,我还没有做成功这个:一个正在执行的exe进程使用一个订阅者组件接受事件。
    也就是说IEventSubscription如何使用来实现以上目的呢?
    三个问题盼复。再次感谢。
    by the way,我没有找到IMDB的影子,是否被取消了?
      

  6.   

    三个问题的看法:
    (1)将组件标记为QC应该不成问题,是否你没找对地方?现在版本的VC不能认QUEUEABLE,以后的版本应该可以。
    (2)线程模型,为简单起见,建议使用Apartment模型;如果考虑效率,可采用COM+的native(?)模型。
    (3)在 COM Catalog的层次目录中,从根对象COMAdminCatalog开始找到订阅对象为止,然后调用IEventSubscription的方法。
    另外,IMDB和Load Balance Server在Windows 2000的Server版本中都被去掉了,但是在Advanced Server中保留了Load Balance Server。
    我没有做过COM+的应用,只是凭理解和以前看过的技术资料回答你的问题。关键还需要你自己摸索。
      

  7.   

    我在组件服务管理工具中COM+应用下我的事件类的属性对话框中没有找到将其设置为QC的
    地方,是否在别的地方,亦或组件需要满足什么条件呢?
    要是pam大哥能够给我个VB或VC的例子说明如何让一个exe进程获得指定事件类的临时事件订阅能力就太感谢了。如果这里写不下,请给我发email:[email protected] 或 [email protected] 。例子呀!!!
    如果你有时间的话,万分感激。
    因为我对这些系统对象编程还没有入门,所以MSDN对我来说太不形象了。
      

  8.   

    例子:http://mspress.microsoft.com/mspress/products/3282/
      

  9.   

    例子我已找到,正在看。但是QC需要MSMQ的支持,而要用到MSMQ的更多功能需要Active
    Dirtory服务器,看来不适用于一些简单的无服务器的对等机器间的异步事件。
    但我看见Windows2000还有一个AsynCall,是否是你所说的异步机制。
      

  10.   

    另外,你说的例子里关于COM+事件系统的例子只是一个简单的永久订阅者。并不是你说的使用IEventSubstription临时订阅者的方式。
    如果有空的话,请帮帮我吧。教我怎么使用IEventSubstription来做一个临时订阅。
    十万分感激。
      

  11.   

    COM Catalog提供了一套对象库,树根对象的CLSID为COMAdmin.COMAdminCatalog,你可以用GetObject或者CreateObject获得树根对象,然后根据层次关系一直找到你要的那个发布者,把你的对象加到订阅表中。IEventSubstription接口的属性SubscriberInterface就是你要设置的对象指针。
    要完成这项工作,你必须熟悉对象库的用法,特别要弄清楚COM Catalog对象树的结构,现在除了我前面提到的MSDN中的资料,没有其他的信息可供使用。我建议你可以参考MMC程序的Component Service add-on的对象层次结构,它也是用COM Catalog对象库实现的,但只是一个子集。
    在Windows2000中,类似这样的技术还有很多,最典型的是活动目录的管理,你可以通过ADSI管理所有的网络资源。所以掌握这项技术对于以后在Windows平台上开展工作非常有帮助。
    另外,我觉得MSMQ不需要活动目录的支持,但需要相应的服务。
    我现在没有环境,可能帮不上忙了,你试一试吧。如果不行,也不用沮丧,毕竟不是你的错,是MS的问题,是正常现象。
      

  12.   

    谢谢,我尽量试试吧。如果有了环境,别忘了马上告诉我:[email protected]
    [email protected]
    现在我想解决如下问题:
    1。如何创建临时订阅者在运行期间接收COM+事件系统的事件?
    2。如何订阅另一台机器上的事件呢?
    COM+真是神奇呀。
      

  13.   

    我已明了。但是使一个运行期间组件接收COM+事件感觉意义不大。
    另外,看了MSJ的一篇关于COM+事件系统的文章,里面好像提到现有的COM+版本不支持订阅的跨机器边界的能力。
    另外一点,IEventSubscription不是从COMAdminCatalog取得,而是从IEventSystem取得。COMAdminCatalog中注册的仍然是永久订阅。
      

  14.   

    什么时候出《Understanding COM+》呀!!!
    国外的这类书要是国内有影印版就好了,可以快一点和便宜一点。
    《COM原理与应用》性价比很高。不过里面还是有一点遗憾,就是例子不够详尽。
    大概是应为内容太多的缘故。祝出更多的书,造福全人类。
      

  15.   

    《Understanding COM+》--我两年都看过这本书了,清华出的,潘爱民译的!