关于COM+事件系统的问题

Marksman 2000-03-26 07:19:00
加精
怎样使得COM+的事件订阅者是一个活动的COM组件呢?
也就是说如何让一个已经被创建的订阅者收到事件,因为我看见每当Fire事件时COM+总是
启动一个新的事件订阅者组件的实例。
是不是让活跃的订阅者收事件是一种错误的编程方式?
另外订阅者和事件类采用何种线程模式最适合呢?
...全文
704 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
fatty 2001-09-27
  • 打赏
  • 举报
回复
《Understanding COM+》--我两年都看过这本书了,清华出的,潘爱民译的!
Marksman 2000-04-03
  • 打赏
  • 举报
回复
什么时候出《Understanding COM+》呀!!!
国外的这类书要是国内有影印版就好了,可以快一点和便宜一点。
《COM原理与应用》性价比很高。不过里面还是有一点遗憾,就是例子不够详尽。
大概是应为内容太多的缘故。祝出更多的书,造福全人类。
Marksman 2000-04-03
  • 打赏
  • 举报
回复
我已明了。但是使一个运行期间组件接收COM+事件感觉意义不大。
另外,看了MSJ的一篇关于COM+事件系统的文章,里面好像提到现有的COM+版本不支持订阅的跨机器边界的能力。
另外一点,IEventSubscription不是从COMAdminCatalog取得,而是从IEventSystem取得。COMAdminCatalog中注册的仍然是永久订阅。
Marksman 2000-04-01
  • 打赏
  • 举报
回复
谢谢,我尽量试试吧。如果有了环境,别忘了马上告诉我:marksman@chinaren.com
sunjump@263.net。
现在我想解决如下问题:
1。如何创建临时订阅者在运行期间接收COM+事件系统的事件?
2。如何订阅另一台机器上的事件呢?
COM+真是神奇呀。
pam 2000-03-31
  • 打赏
  • 举报
回复
COM Catalog提供了一套对象库,树根对象的CLSID为COMAdmin.COMAdminCatalog,你可以用GetObject或者CreateObject获得树根对象,然后根据层次关系一直找到你要的那个发布者,把你的对象加到订阅表中。IEventSubstription接口的属性SubscriberInterface就是你要设置的对象指针。
要完成这项工作,你必须熟悉对象库的用法,特别要弄清楚COM Catalog对象树的结构,现在除了我前面提到的MSDN中的资料,没有其他的信息可供使用。我建议你可以参考MMC程序的Component Service add-on的对象层次结构,它也是用COM Catalog对象库实现的,但只是一个子集。
在Windows2000中,类似这样的技术还有很多,最典型的是活动目录的管理,你可以通过ADSI管理所有的网络资源。所以掌握这项技术对于以后在Windows平台上开展工作非常有帮助。
另外,我觉得MSMQ不需要活动目录的支持,但需要相应的服务。
我现在没有环境,可能帮不上忙了,你试一试吧。如果不行,也不用沮丧,毕竟不是你的错,是MS的问题,是正常现象。
Marksman 2000-03-30
  • 打赏
  • 举报
回复
另外,你说的例子里关于COM+事件系统的例子只是一个简单的永久订阅者。并不是你说的使用IEventSubstription临时订阅者的方式。
如果有空的话,请帮帮我吧。教我怎么使用IEventSubstription来做一个临时订阅。
十万分感激。
Marksman 2000-03-30
  • 打赏
  • 举报
回复
例子我已找到,正在看。但是QC需要MSMQ的支持,而要用到MSMQ的更多功能需要Active
Dirtory服务器,看来不适用于一些简单的无服务器的对等机器间的异步事件。
但我看见Windows2000还有一个AsynCall,是否是你所说的异步机制。
pam 2000-03-30
  • 打赏
  • 举报
回复
例子:http://mspress.microsoft.com/mspress/products/3282/
Marksman 2000-03-30
  • 打赏
  • 举报
回复
我在组件服务管理工具中COM+应用下我的事件类的属性对话框中没有找到将其设置为QC的
地方,是否在别的地方,亦或组件需要满足什么条件呢?
要是pam大哥能够给我个VB或VC的例子说明如何让一个exe进程获得指定事件类的临时事件订阅能力就太感谢了。如果这里写不下,请给我发email:sunjump@263.net 或 marksman@chinaren.net 。例子呀!!!
如果你有时间的话,万分感激。
因为我对这些系统对象编程还没有入门,所以MSDN对我来说太不形象了。
pam 2000-03-29
  • 打赏
  • 举报
回复
缺省情况就是这样的,但是你可以改变这种行为:
(1)订阅事件时有一个“Fire In Parallel”标记可以使多个事件并行进行,COM+采用多线程实现,但不保证顺序。
(2)把COM+的事件机制和异步机制结合起来,把事件类标记成QC组件。
其实你用了(2)就可以不用(1)了。
看起来你的应用很先进,已经用上COM+了,而且还用到了这些新的特性。难得。
Marksman 2000-03-29
  • 打赏
  • 举报
回复
另外,我发现Fire事件后,事件的发起者总是同步地等到事件的订阅者完成后才返回,
多订阅者并行时要等到最后一个完成,这样如果一个订阅者阻塞会不会造成事件的发起者
阻塞?怎么解决呢?
因为我想需要做到这样:事件源异步地Fire事件,而不会因为订阅者僵死而阻塞,事件
在一定时间内未被处理应被系统抛弃。这样的话会需要一种事件缓冲的机制,不知道
COM+事件系统怎么解决呢?
Marksman 2000-03-29
  • 打赏
  • 举报
回复
我找找先,谢谢
pam 2000-03-29
  • 打赏
  • 举报
回复
关于COM Catalog的编程说明可以从比较新的MSDN-Library中查到,我可以确认在99年时月份的MSDN-Library以及MS的MSDN网站(http://msdn.microsoft.com/)上包括这些信息。
路径为:
MSDN-Library
Platform SDK
Component Services
Reference
pam 2000-03-29
  • 打赏
  • 举报
回复
三个问题的看法:
(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+的应用,只是凭理解和以前看过的技术资料回答你的问题。关键还需要你自己摸索。
Marksman 2000-03-29
  • 打赏
  • 举报
回复
如何将组件标记为QC呢?我在事件类接口声明中写了QUEUEABLE结果vc不认。
COM+组件管理中也没有找到如何将事件类标记为QC。
还有,事件类的线程模式采用何种最好呢?
另外,我还没有做成功这个:一个正在执行的exe进程使用一个订阅者组件接受事件。
也就是说IEventSubscription如何使用来实现以上目的呢?
三个问题盼复。再次感谢。
by the way,我没有找到IMDB的影子,是否被取消了?
Marksman 2000-03-28
  • 打赏
  • 举报
回复
能够说的详细点呢?谢谢
或者,除了MSDN以外,还有哪里可以找到这些系统接口的编程使用方法呢?
如果有,请给我EMAIL吧。感激涕零。 Marksman@Chinaren.com
pam 2000-03-27
  • 打赏
  • 举报
回复
COM+的事件订阅分两种:永久的和短暂的。
通过COM+管理程序增加的事件订阅属于前者,每次激发事件时要创建一个新的实例。
像你这种情况应该使用短暂型的事件订阅,通过COM+ Catalog的接口IEventSubscription增加订阅信息即可。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧