Что такое IconnectionPoint и EventHandling
Пытаясь понять, что такое IConnectionPoint
и как это связано с IConnectionPointContainer,IEnumConnectionPoints,IEnumConnections
и EventHandling.
Прочитайте статьи из MSDN и CodeProject, в которых рассказывается о других методах, таких как: 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 в стандартной системе клиент-сервер и использованием точек подключения состоит в том, что в стандартном случае клиент-сервер сервер предоставляет список методов, которые использует клиент, а в случае точки подключения - Клиент предоставляет набор методов, которые использует сервер.
1 ответ
Похоже, вы неправильно поняли общую картину. Обычно ваш клиент будет получать события, а COM-объект будет запускать эти события. Для этого клиент запрашивает (QueryInterface()
) IConnectionPointContainer
интерфейс, звонки IConnectionPointContainer::FindConnectionPoint()
а также IConnectionPoint::Advise()
и передает указатель на себя или некоторый подобъект там.
Клиент должен будет реализовать некоторый интерфейс событий (один GUID которого передается в IConnectionPointContainer::FindConnectionPoint()
). После подписки (уведомления) клиент будет получать звонки с COM-сервера - события.
Обычно COM-сервер делает что-то регулярно и решает уведомить об этом клиентов (скажем, пользователь перемещает мышь в элементе управления ActiveX) - он просто получает массив указателей на приемники событий и вызывает метод, который он хочет, на этом интерфейсе.
События COM на самом деле являются реализацией обратных вызовов. Так же, как вы используете обратный вызов в C++ (или C или любых других языках, поддерживающих указатели функций или интерфейсы), вы используете события в COM. Да, вы правы в том, что когда сервер запускает событие, клиент фактически действует как сервер, реагирующий на событие. Это сценарий обратного вызова - другой код вызывает вашу функциональность. В этом случае сервер вызывает вашу реализацию интерфейса событий.
Эти две статьи содержат полезную информацию:
https://devblogs.microsoft.com/oldnewthing/?p=4113
https://devblogs.microsoft.com/oldnewthing/20130612-00/?p=4103
Что @sharptooth забыл упомянуть, так это указатель, переданный на IConnectionPoint::Advise
должен быть указателем на COM
объект.
Это означает, что он должен реализовывать не только конкретный интерфейс событий, но и IUnknown
интерфейс.