2012-05-16 2 views
0

У меня есть DLL ActiveX, которая загружает дочернюю dll (плагин NPAPI). Мой дочерний плагин создает несколько потоков, и им необходимо вернуться на веб-страницу. В моей ActiveX (родительской dll) у меня есть точки подключения, чтобы запустить событие для javascript для предоставления обновлений. Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как ребенок может вызвать родительскую DLL.Загрузка DLL и дочерней dll, вызывающей родительский класс

То, что я пробовал: 1: Передача указателя функции дочерней dll функции, которая не входит в класс, и использует глобальную переменную, которая является указателем на класс ActiveX (это), но точка подключения не выполняется, когда Invoke с E_UNEXPECTED

2: Передача дочерней dll указателю на мою функцию класса и получение тех же результатов.

Я все еще изучаю C++ и COM в то же время, извините за свое невежество. Спасибо.

ответ

0

У COM есть способы настроить, чтобы вы могли вызывать COM-методы из других потоков, но самый простой способ сделать это - сделать все обращения к элементу управления activex в основном потоке. Один из способов сделать это - создать окно сообщений и отправить ему сообщение Windows, при этом LPARAM будет указателем на структуру данных, содержащую параметры, необходимые для вызова; вы создаете структуру и заполняете ее, затем публикуете сообщение и освобождаете память после того, как ваш WINPROC совершил звонок.

FireBreath использует этот подход, и он работает достаточно хорошо. Кстати, вы считаете, что вы используете плагин NPAPI как плагин FireBreath, чтобы он работал как в activex, так и в npapi?

Вот некоторые примеры кода, которые могут помочь:

  • WinMessageWindow (.cpp, .h) - это класс FireBreath использует для создания окна сообщений; обратить особое внимание на DefaultWinProc, который используется как часть асинхронном вызова функции (часто поперечному нить)
  • NpapiBrowserHostAsyncWin (.cpp, .h) - это класс, используемый в некоторых браузерах для NPAPI плагин для работы вокруг не NPN_PluginThreadAsyncCall работать. Он использует WinMessageWindow сделать перекрестные вызовы потоков в _scheduleAsyncCall

Надежда, что помогает

+0

Может быть, я должен изменить вопрос. Я пытаюсь использовать функцию Javascript для ActiveX. – hapyfishrmn

+0

Вы можете отредактировать его, но мой ответ не изменится; это то, как FireBreath вызывает обращения к Javascript в IE. – taxilian

+0

Я пытаюсь использовать функцию Javascript для ActiveX. В моем ActiveX у меня есть класс CSample и точка подключения в классе Fire_Update (который запускает событие, которое js выбирает). Пока я в классе, я могу вызвать Fire_Update, но моя дочерняя dll породила потоки и требует вызова обновления. Как мне вернуться к классу. – hapyfishrmn

Смежные вопросы