Что такое IconnectionPoint и EventHandling - PullRequest
3 голосов
/ 25 августа 2010

Попытка понять, что такое IConnectionPoint и как это связано с IConnectionPointContainer,IEnumConnectionPoints,IEnumConnections и EventHandling .

Прочитайте статьи из MSDN и CodeProject , которые объясняют другие методы, такие как: QueryInterface() и другие.

Я не могу понять, как все эти вещи (IConnectionPointContainer,IEnumConnectionPoints,IEnumConnections) связаны друг с другом и обработкой событий.

Я просто хочу создать simpleClient, который будет запускать событие в COM-объекте.

Если есть какие-либо статьи или фрагмент кода, которые могут объяснить, как вещи связаны друг с другом с помощью простого и небольшого фрагмента кода, будут полезны.

Стоит отметить, что я недавно начал разработку на C, новичок.

Edit @ 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 Ответ

7 голосов
/ 25 августа 2010

Похоже, вы неправильно поняли общую картину. Обычно ваш клиент будет получать события, а COM-объект будет запускать эти события. Для этого клиент запрашивает (QueryInterface()) интерфейс IConnectionPointContainer, вызывает IConnectionPointContainer::FindConnectionPoint() и IConnectionPoint::Advise() и передает туда указатель на себя или некоторый подобъект.

Клиент должен будет реализовать интерфейс некоторых событий (один GUID которого передается в IConnectionPointContainer::FindConnectionPoint()). После подписки ( рекомендуется ) клиент будет получать вызовы от COM-сервера - события.

Обычно COM-сервер делает что-то регулярно и решает уведомить об этом клиентов (скажем, пользователь перемещает мышь в элементе управления ActiveX) - он просто получает массив указателей на приемники событий и вызывает метод, который он хочет, на этом интерфейсе.

События COM на самом деле являются реализацией обратных вызовов . Так же, как вы используете обратный вызов в C ++ (или C или любых других языках, поддерживающих указатели функций или интерфейсы), вы используете события в COM. Да, вы правы, что когда сервер запускает событие, клиент фактически действует как сервер, реагирующий на событие. Это сценарий обратного вызова - другой код вызывает вашу функциональность. В этом случае сервер вызывает вашу реализацию интерфейса событий.

...