如何用Delphi来实现COM对象的事件?急!(100分)

  • 主题发起人 主题发起人 zag2000
  • 开始时间 开始时间
Z

zag2000

Unregistered / Unconfirmed
GUEST, unregistred user!
我在用Delphi封COM的时候,不知如何在接口中实现事件,到底COM中接口的不同事件是
在何时触发的? 急!急!急!
请告之详细的实现方法,最好有源码,谢谢!
如果有这方面的资料请给我发以份,好吗?
 
使用可连接对象来实现接口事件。请查阅“连接对象”
这个问题要搞懂不是一天的事。因为当你理解了,会发现很多问题...
 
to z_cd:
你好,谢谢你的回答,你能详细说明一下吗?或者给我发一份有关的资料,我现在
的工作急需解决这些问题,拜托了!!!
 
查关键字 ConnectionPoint
http://www.techvanguards.com 有它的例子

实现COM的接口事件是件十分十分麻烦的事,所以很多人都避免使用接口事件
 
to z_cd:
那对于类中原来定义的事件,如果不用接口事件的话,如何用接口实现并将其暴露出来?
 
没办法暴露出来。所以COM中很少用事件,ActiveX Control中的事件就用了ConnectionPoint来实现的。

Delphi 和自动化对事件思想提供了两种完全不同的方法。
(1) Delphi 中的事件
Delphi 对事件的处理遵从了KISS(Keep it simple,stupid!)方法论。
事件被作为方法指针来实现—这些指针分别指向应用程序中的一些
方法,并在通过方法指针调用方法的时候被执行。例如,假设要
在应用程序的一个控件中处理一个事件。如果抽象地看待这种情形,
那么本例中的“服务器”就是一个控件,它定义和触发事件。而
“客户端”就是使用这个控件的应用程序,因为它通过给事件方法
指针指定一些特殊的方法名而与事件相连。
虽然这种简单的事件模型是使Delphi 简单易用的原因之一,但它
必然以牺牲了某些功能为代价。例如,它没有一种允许多个用户监
听同一事件(称为多点广播)的内嵌功能,也无法在不编写RTTI 代码
的情况下动态地得到一个事件的类型描述。
(2) 自动化中的事件
相对于Delphi 简单却功能有限的事件模型而言,自动化的事件模型
功能强大但却复杂得多。作为一个COM 程序员,你也许会认为自动
化中的事件是通过接口来实现的。事件只是作为接口的一部分。这
里的接口常被称为事件接口或输出接口(outgoing interface)。之
所以称之为输出接口,是因为它不像别的接口那样是由服务器实现
的,而是由服务器的客户端来实现;接口的方法从服务器端被外调
到了客户端。像所有的接口一样,每个事件接口都有其相应的IID
(接口标识符)以唯一地标识它们。另外在自动化对象的类型库中能
够找到事件接口的描述。需要向客户端提供事件接口的服务器必须
实现IConnectionPointContainer接口。
 
to z_cd:
你好,谢谢你的回答,不过我的认识还很抽象,你能给我一些用Delphi实现
IConnectionPointContainer接口的例子吗?最好提供一段服务器中实现事件的代码,好吗?

如果有一些开发COM的心得,可以分享一点吗?
 
你新建AutoObject的时候选中Generate Event Support Code选项,便可以定义Outgoing Interface
然后去 http://www.techvanguards.com 下载一工具EventSinkImp,可以将自动化的事件接口
转为Delphi事件,那里还有一些简单的例子。仔细弄懂直到会用,否则没有进展。

到最后还要牵涉到复杂的COM/DCOM设置和权限问题。

有本书《Delphi 5 高级开发人员指南》中有一章高级自动化技术专门讲这个,例子也很充分。
 
to z_cd:
看得出,你是一位优秀的程序员,我想和你交个朋友好吗?能告之你的联系方式吗?
你一定用Delphi封过COM,对COM相当熟悉,我是因为工作需要,刚开始接触COM,能和我
交流有关这方面的体会吗?
 
交个朋友可以啊,不过要等我找到新工作,稳定下来才会有联系方式
 
你现在在哪?像你这样的高手不会找不到工作的。你有Email吗?
 
只有用DCOMConnection才能支持自动化事件(但是还要很烦的DCOM配置),如果用SocketConnection就完完了。

说白了,你想用自动化事件,无非是要服务端控制客户端。
其实不用自动化事件,用回调接口也可以实现一些简单控制客户端的操作,方法如下:
1. 客户端声明一个自动化接口;
2. 客户端在连接服务端后将该接口传到服务端;
3. 服务端记住该接口并在适当的时候调用该接口来控制客户端。
具体例子可去http://www.distribucon.com/midas.html下载一个Socket Server Callback的例子看看。
 
接受答案了.
 
后退
顶部