Здравствуйте, Vi2, Вы писали:
Vi2>А что хотелось бы?
Должен признать, я неправильно сформулировал вопрос. На самом деле я не могу с помощью мастера реализовать методы событий в Connection Point. То есть, иногда срабатывает, а иногда нет. Не могу даже выяснить, когда же возникает проблема: не прослеживается зависимость от аргументов. Клас всё время перед попыткой очищаю от сгенерированного бесполезных определений (включение файла прокси-объекта, наследование класса от прокси, карту точек соединения), файл с описанием интерфейсов перекомпилирую. Вот, хотелось бы узнать, сталкивался ли кто-нибудь с подобной проблемой?
Здравствуйте, s_anatoli, Вы писали:
_>Должен признать, я неправильно сформулировал вопрос. На самом деле я не могу с помощью мастера реализовать методы событий в Connection Point. То есть, иногда срабатывает, а иногда нет. Не могу даже выяснить, когда же возникает проблема: не прослеживается зависимость от аргументов. Клас всё время перед попыткой очищаю от сгенерированного бесполезных определений (включение файла прокси-объекта, наследование класса от прокси, карту точек соединения), файл с описанием интерфейсов перекомпилирую. Вот, хотелось бы узнать, сталкивался ли кто-нибудь с подобной проблемой?
По порядку.
1. Создаешь ATL-объект, включаешь поддержку Connection Points.
2. Для события создается dispinterface.
3. В студии открываешь Class View и у интерфейса добавляешь метод.
4. В Class View у интефейса события добавляешь метод события.
5. Компилируем (чтоб cгенерить tlb).
6. В Class View у класс для COM-объект делаем Implement Connection Points.
7. На диалоге выбираем интерфейс события.
8. Готово.
В h-файле для idl будет пустая запись (без методов), потому что для события генерируется dispinterface. Это значит, что этот интерфейс работает через IDispatch (не дуальный), а соответственно, объявления методов (vtable) ему не нужны. В коде, который генерируется мастером во время выполнения Implement Connection Points, dispid-ы уже прописаны. Когда ты реализуешь sink используя SINK_ENTRY_EX, там тоже используятся явные dispid-ы событий.
3. В ClassView для класса COM-объекта выполняем Implement Connection Points.
4. В диалоге указываем оба (или только нужный) вариант connection points.
5. Готово.
Теперь у тебя есть вариант connection points с ранним связыванимем. Если ты указал оба варианта, то твой класс com-объекта поддерживает их оба. В этом случае (если названия методов событий одинаковы для disp-варианта и для нового варианта), то для генерации события нужно использовать приведение к базовому классу, который реализует connection points.
Теперь у тебя для нового интерфейса события в h-файле будет определение и метода. Поэтому в классе sink-а ты можешь просто объявить наследование от этого интерфейса, просто добавить его в карту интерфейсов (а не синков), и просто реализовать метод. Никаких макросов для синков не нужно.