Что такое 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 интерфейс.

Другие вопросы по тегам