尝试了解什么是IConnectionPoint
以及它与IConnectionPointContainer,IEnumConnectionPoints,IEnumConnections
和 EventHandling 的关联方式。
阅读MSDN和CodeProject的艺术作品,其中解释了其他方法,例如:QueryInterface()
和其他方法。
我无法弄清楚所有这些事情(IConnectionPointContainer,IEnumConnectionPoints,IEnumConnections
)是如何相互关联以及事件处理的。
我只想创建一个将触发COM对象中的事件的simpleClient。
如果有任何文章或代码片段可以解释事物如何通过简单和小块代码相互关联将会有所帮助。
值得一提的是我最近开始在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进行正常编程与使用连接点之间的主要区别在于,在标准客户端 - 服务器情况下,服务器公开客户端使用的方法列表,并在连接点中在这种情况下,客户端公开服务器使用的一组方法。
答案 0 :(得分:7)
看起来你错了。通常,您的客户端将接收事件,COM对象将触发这些事件。为实现此目的,客户端请求QueryInterface()
IConnectionPointContainer
接口,调用IConnectionPointContainer::FindConnectionPoint()
和IConnectionPoint::Advise()
并将指针传递给自己或某个子对象。
客户端必须实现一些事件接口(其中一个GUID被传递到IConnectionPointContainer::FindConnectionPoint()
)。订阅后(建议),客户端将接收来自COM服务器的调用 - 事件。
通常,COM服务器会定期执行某些操作并决定通知客户端(例如用户在ActiveX控件中移动鼠标) - 它只获取一个指向事件接收器的指针数组,并在该接口上调用它想要的方法。
COM事件实际上是回调的实现。与在C ++(或C或任何其他支持函数指针或接口的语言)中使用回调的方式相同,您可以在COM中使用事件。是的,你是对的,当服务器触发事件时,客户端实际上充当对事件作出反应的服务器。这是一个回调场景 - 其他代码调用您的功能。在这种情况下,服务器会调用您的事件接口实现。
答案 1 :(得分:-1)
这两篇文章提供了有用的信息:
https://devblogs.microsoft.com/oldnewthing/?p=4113
https://devblogs.microsoft.com/oldnewthing/20130612-00/?p=4103
忘了提起@sharptooth的是,传递给IConnectionPoint::Advise
的指针必须是指向COM
对象的指针。
这意味着它不仅必须实现特定的事件接口,而且还必须实现IUnknown
接口。