4

试图了解它是什么IConnectionPoint以及它是如何连接到IConnectionPointContainer,IEnumConnectionPoints,IEnumConnectionsEventHandling

阅读MSDNCodeProject的文章,这些文章解释了其他方法,例如:QueryInterface()和其他东西。

我无法弄清楚所有这些东西(IConnectionPointContainer,IEnumConnectionPoints,IEnumConnections)是如何相互关联的以及事件处理。

我只想创建一个 simpleClient 来触发 COM 对象中的事件。

如果有任何文章或代码片段可以用简单而小块的代码来解释事物之间的关系,将会很有帮助。

值得一提的是,我最近开始用 C 开发,一个初学者。

编辑@sharptooth

换行“ typically your client will receive events and the COM object will trigger those events.

从许多文章中,我的理解是当我们在那时使用连接点时, the client exposes a set of methods that the server uses.

我只是概述了来自TechRepublich 的文章的一部分:

客户端服务器与接收源

因此,在标准客户端-服务器系统中使用 COM 进行正常编程与使用连接点之间的主要区别在于,在标准客户端-服务器情况下,服务器公开客户端使用的方法列表,而在连接点情况下,客户端公开了一组服务器使用的方法。

4

2 回答 2

9

看起来你把大局弄错了。通常,您的客户端将接收事件并且 COM 对象将触发这些事件。为了实现这一点,客户端请求(QueryInterface()IConnectionPointContainer接口,调用IConnectionPointContainer::FindConnectionPoint()IConnectionPoint::Advise()传递一个指向自身或那里的某个子对象的指针。

客户端必须实现一些事件接口(其中一个 GUID 被传递到IConnectionPointContainer::FindConnectionPoint())。一旦订阅(建议),客户端将接收来自 COM 服务器的调用 - 事件。

通常,COM 服务器会定期执行某些操作并决定通知客户端(比如用户在 ActiveX 控件中移动鼠标)——它只是获取指向事件接收器的指针数组并在该接口上调用它想要的方法。

COM 事件实际上是回调的一种实现。在 C++(或 C 或任何其他支持函数指针或接口的语言)中使用回调的方式与在 COM 中使用事件的方式相同。是的,您是对的,当服务器触发事件​​时,客户端实际上充当了对事件作出反应的服务器。这是一个回调场景 -其他代码调用您的功能。在这种情况下,服务器调用事件接口的实现。

于 2010-08-25T06:42:27.763 回答
-1

这两篇文章提供了有用的信息:

https://devblogs.microsoft.com/oldnewthing/?p=4113

https://devblogs.microsoft.com/oldnewthing/20130612-00/?p=4103

@sharptooth 忘记提到的是,传递给的指针IConnectionPoint::Advise必须是指向COM对象的指针。

这意味着它不仅必须实现特定的事件接口,还必须实现IUnknown接口。

于 2020-01-02T19:06:35.223 回答