组件对象模型(COM)连接点是能够处理事件回调功能的接口。如果你经常使用Win32
API,你一定会熟悉事件回调函数。回调函数在程序中频繁出现,如EnumWindows()。
虽然COM连接点比普通连接点复杂,但它能够提供更灵活的功能,因为所有的参数和回调函数都使用COM子接口来执行。COM子接口允许各个函数在不同进程之间相互调用,这在普通回调函数中是不允许的。
在讲述如何在程序中添加COM连接点之前,你首先你应该对基本的术语有个了解,比如:接口,事件类型。很多相关的事件都被集成为接口。通常,一个COM对象的接口与一个C++类中的全局函数很类似,所以一个连接其实把一系列的事件包含在一个COM接口上。
例如Listing A中的定时器类。这一个类包括了SetExpiredProc(), SetTime(), Start(),Stop(),及构造函数CExampleTimer()和一个局部函数的RunTimer()。描述这些特性的一个COM接口只包括相关的全局函数,如SetTime(), Start(), Stop()。你可以建立一个包含名为TimerExpired()的事件的COM接口连接点。
在典型的COM程序中,一个COM对象是带有特定接口的服务器,与之相连的客户端执行一定的事件。当触及连接点时,COM服务器就向客户端传递信息,这一信息包括:服务器端已经发生触发事件,哪一个客户端想接受。此时,匹配的客户端即接受相关的事件。所以当提及连接点时,服务器一端称为发送端,而客户端称为接受端。
可以看出,标准服务器-客户端的COM连接点与普通程序的主要区别为,前者的服务器一端能够提供客户端执行的一系列事件。
从术语本身你可以想到连接点的工作过程。第一,接受器通过执行IconnectionPointContainer接口与发送器连接起来,IconnectionPointContainer接口提供两个方法:
为了把问题简单化,假设接受器知道它自己想接受的事件,这样接受器通过事件类型COM接口调用IConnectionPointContainer::FindConnectionPoint()方法。如果一切顺利,接受器就获得一个指向IconnectionPoint接口的指针。