Как организовать регистрацию 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 имеют одинаковый Си-шный формат соглашения о вызове функций. Тут подвоха со стеком нет.
Но указатель на класс я наверное получаю неверный, или недопустимый для доступа к методу класса.

Как корректно дернуть метод класса АХ из внешней статической функции?
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 Россия  
Дата: 26.12.13 06:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, anpis, Вы писали:


А>Скорее всего FireMyNotyfyEvent вызывается не в том потоке и нет маршалинга. Если настройки ActiveX по умолчанию, то он, скорее всего, STA и COM-евенты нужно либо кидать в том же потоке, в котором был создан COM-объект, либо организовывать маршалинг.


Спасибо за идею.
Какие настройки и где следует изменить?
У меня простая однопоточная задача с монопольным использованием этого компонента во всей системе.
Компонент создавал с помощью Wizard-а с настройками по-умолчанию.
Re[3]: Как организовать регистрацию Callback-ов из ActiveX (ATL) компонента
От: anpis Россия  
Дата: 26.12.13 09:13
Оценка:
Здравствуйте, 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>Как ее корректно объявить, чтобы соблюсти соглашение для вызова функции?

РЕШИЛ ПРОБЛЕМУ!!
Действительно — конструируется АХ в другом потоке и инициализация глобального указателя напрямую из конструктора не достигает цели .
Порешал глобальной функцией, через которую передаю указатель из конструктора для инициализации глобального пойнтера на класс.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.