Как организовать регистрацию Callback-ов из ActiveX (ATL) компонента
От: anpis Россия  
Дата: 25.12.13 11:42
Оценка:
- Имею DLL-ку, которая написана на Си (обвязка к драйверу Bluetooth) и которая имеет обработку событий из драйвера посредством установки своих Callback-ов.
— Имею ActiveX компонент-оболочку к этой DLL-ке, созданный в VS2008 посредством технологии ATL.
Все замечательно — методы в DLL работают, свойства изменяются.
Одно НО.
Есть пара событий, которые генерит DLLка.
К ним можно прицепиться с помощью стандартных Си-шных callback-функций (в данном случае — даже без аргументов, чисто уведомления).

Написал статическую ф-ю без аргументов, которую отдал в DLL-ку в качестве Callback-a в конструкторе компонента.
Сжевала.
Столкнулся с проблемой: событие внутри самого АХ-компонента генерируется вызовом его функции-внутреннего публичного метода FireMyNotyfyEvent().
Облазил весь ATL-код и не нашел переменной, через которую можно добраться до метода класса извне .

Попробовал создать статическую переменную-указатель на экземпляр эьлго класса и инициализировать ее в конструкторе AX компонента. И потом подергать через нее медод генерации события в компоненте.
Облом — метод вызывается, но трапится на получении доступа к локальным данным.
Если тот же метод FireMyNotyfyEvent() вызывать из другого метода класса компонента, все проходит нормально — событие генерится.
Значит — проблема в правильном вызове метода класса компонента FireMyNotyfyEvent() из внешней статической callback-функции.

И сама статическая функция и ее прототип в DLL имеют одинаковый Си-шный формат соглашения о вызове функций. Тут подвоха со стеком нет.
Но указатель на класс я наверное получаю неверный, или недопустимый для доступа к методу класса.

Как корректно дернуть метод класса АХ из внешней статической функции?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.