- Имею DLL-ку, которая написана на Си (обвязка к драйверу Bluetooth) и которая имеет обработку событий из драйвера посредством установки своих Callback-ов.
— Имею ActiveX компонент-оболочку к этой DLL-ке, созданный в VS2008 посредством технологии ATL.
Все замечательно — методы в DLL работают, свойства изменяются.
Одно НО.
Есть пара событий, которые генерит DLLка.
К ним можно прицепиться с помощью стандартных Си-шных callback-функций (в данном случае — даже без аргументов, чисто уведомления).
Написал статическую ф-ю без аргументов, которую отдал в DLL-ку в качестве Callback-a в конструкторе компонента.
Сжевала.
Столкнулся с проблемой: событие внутри самого АХ-компонента генерируется вызовом его функции-внутреннего публичного метода FireMyNotyfyEvent().
Облазил весь ATL-код и не нашел переменной, через которую можно добраться до метода класса извне .
Попробовал создать статическую переменную-указатель на экземпляр эьлго класса и инициализировать ее в конструкторе AX компонента. И потом подергать через нее медод генерации события в компоненте.
Облом — метод вызывается, но трапится на получении доступа к локальным данным.
Если тот же метод FireMyNotyfyEvent() вызывать из другого метода класса компонента, все проходит нормально — событие генерится.
Значит — проблема в правильном вызове метода класса компонента FireMyNotyfyEvent() из внешней статической callback-функции.
И сама статическая функция и ее прототип в DLL имеют одинаковый Си-шный формат соглашения о вызове функций. Тут подвоха со стеком нет.
Но указатель на класс я наверное получаю неверный, или недопустимый для доступа к методу класса.
Как корректно дернуть метод класса АХ из внешней статической функции?
Re: Как организовать регистрацию Callback-ов из ActiveX (ATL) компонента
От:
Аноним
Дата:
25.12.13 12:35
Оценка:
Здравствуйте, anpis, Вы писали:
<skip> A>Если тот же метод FireMyNotyfyEvent() вызывать из другого метода класса компонента, все проходит нормально — событие генерится. A>Значит — проблема в правильном вызове метода класса компонента FireMyNotyfyEvent() из внешней статической callback-функции.
Скорее всего FireMyNotyfyEvent вызывается не в том потоке и нет маршалинга. Если настройки ActiveX по умолчанию, то он, скорее всего, STA и COM-евенты нужно либо кидать в том же потоке, в котором был создан COM-объект, либо организовывать маршалинг.
Re[2]: Как организовать регистрацию Callback-ов из ActiveX (ATL) компонента
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, anpis, Вы писали:
А>Скорее всего FireMyNotyfyEvent вызывается не в том потоке и нет маршалинга. Если настройки ActiveX по умолчанию, то он, скорее всего, STA и COM-евенты нужно либо кидать в том же потоке, в котором был создан COM-объект, либо организовывать маршалинг.
Спасибо за идею.
Какие настройки и где следует изменить?
У меня простая однопоточная задача с монопольным использованием этого компонента во всей системе.
Компонент создавал с помощью Wizard-а с настройками по-умолчанию.
Re[3]: Как организовать регистрацию Callback-ов из ActiveX (ATL) компонента
Здравствуйте, anpis, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, anpis, Вы писали:
А>>Скорее всего FireMyNotyfyEvent вызывается не в том потоке и нет маршалинга. Если настройки ActiveX по умолчанию, то он, скорее всего, STA и COM-евенты нужно либо кидать в том же потоке, в котором был создан COM-объект, либо организовывать маршалинг.
A>Спасибо за идею. A>Какие настройки и где следует изменить? A>У меня простая однопоточная задача с монопольным использованием этого компонента во всей системе. A>Компонент создавал с помощью Wizard-а с настройками по-умолчанию.
Может быть поставить вопрос иначе: как затолкать из АХ компонента свой Callback в DLL?
Сама DLL написана мною же и я волен сделать любую интерфейсную функцию к ней. В том числе например — принять указатель на callback из АХ-компонента.
Но вызываться это будет из сишной функции в DLLке.
Как ее корректно объявить, чтобы соблюсти соглашение для вызова функции?
Re[4]: Как организовать регистрацию Callback-ов из ActiveX (ATL) компонента
От:
Аноним
Дата:
26.12.13 11:56
Оценка:
Здравствуйте, anpis, Вы писали:
A>Здравствуйте, anpis, Вы писали:
A>>Здравствуйте, Аноним, Вы писали:
А>>>Здравствуйте, anpis, Вы писали:
А>>>Скорее всего FireMyNotyfyEvent вызывается не в том потоке и нет маршалинга. Если настройки ActiveX по умолчанию, то он, скорее всего, STA и COM-евенты нужно либо кидать в том же потоке, в котором был создан COM-объект, либо организовывать маршалинг.
A>>Спасибо за идею. A>>Какие настройки и где следует изменить? A>>У меня простая однопоточная задача с монопольным использованием этого компонента во всей системе. A>>Компонент создавал с помощью Wizard-а с настройками по-умолчанию.
A>Может быть поставить вопрос иначе: как затолкать из АХ компонента свой Callback в DLL?
A>Сама DLL написана мною же и я волен сделать любую интерфейсную функцию к ней. В том числе например — принять указатель на callback из АХ-компонента. A>Но вызываться это будет из сишной функции в DLLке. A>Как ее корректно объявить, чтобы соблюсти соглашение для вызова функции?
РЕШИЛ ПРОБЛЕМУ!!
Действительно — конструируется АХ в другом потоке и инициализация глобального указателя напрямую из конструктора не достигает цели .
Порешал глобальной функцией, через которую передаю указатель из конструктора для инициализации глобального пойнтера на класс.