Аннотация :
Статья посвящена технологии Connection Points в программах на MFC. Автор кратко описывает сущность и назначение этой технологии, а затем демонстрирует создание COM-клиента и COM-сервера на базе MFC с её использованием.
Ситуация — два клиента CLSRV1 и CLSRV2 (MFC+ATL, в свою очередь тоже COM-сервера) подписаны на события одного и того-же экземпляра ATL COM сервера SRV. Соответственно сначала CLSRV1 загружает CLSRV2 и SRV, потом подписывается на события от SRV, после чего передает указатель на интерфейс SRV в CLSRV2 и тот в свою очередь тоже подписывется на события от SRV. При этом в CLSRV1 и CLSRV2 реализован разный, частично пересекающийся, набор обработчиков для событий от SRV.
Теперь странности — если обработчик к-л события уже есть в CLSRV1 то он обязательно должен быть и в CLSRV2, иначе при возбуждении события и вызове в SRV pDispatch->Invoke имеем
Ошибка 0x80020003 при возбуждении события: Член группы не найден.
Обработчик в CLSRV1 при этом срабатывает нормально.
Если же ситуация обратная — обработчик есть только в CLSRV2 то в CLSRV1 он вроде как и не нужен, все проходит на ура, без всяких ошибок.
... у которых методы с разными названиями, но с одинаковыми ID? Событие хватает первый встреченный со своим ID в карте BEGIN_DISPATCH_MAP / END_DISPATCH_MAP, невзирая на название.
Разве программирование СOM в MFC, не является очень плохим
тоном — ввиду кривизны и натятнутости, — ограниченности, и далее проблемы по нарастающей,
MFC для COM не предназначена. Нет никакой нормальной инфраструткуры, кроме нескольких макро.
Рекомендовать это к применению кроме как клиентским способом — обрекать людей на проблемы.
Надо бы об этом написать, если вы согласны.
(Если честно, конечно.)
Винтовку добудешь в бою!
Re[2]: Добавление технологии Connection point в приложение н
Здравствуйте, vgrigor, Вы писали:
V>Разве программирование СOM в MFC, не является очень плохим V>тоном — ввиду кривизны и натятнутости, — ограниченности, и далее проблемы по нарастающей, V>MFC для COM не предназначена. Нет никакой нормальной инфраструткуры, кроме нескольких макро.
V>Рекомендовать это к применению кроме как клиентским способом — обрекать людей на проблемы.
V>Надо бы об этом написать, если вы согласны. V>(Если честно, конечно.)
Теперь необходимо в функции InitInstance класса CPointClientApp добавить инициализацию СОМ. В нашем случае вполне сойдет инициализация для STA, поэтому воспользуемся функцией CoInitialize(NULL):
Не могли бы Вы чуть подробнее написать, зачем нужен вызов CoInitialize? Дело в том, что я сделал пример, почти как Ваш, и уменя все работает и без вызова CoInitialize.