Как использовать WndProc из C ++ dll?
Вопрос
Я хочу обработать некоторые сообщения SAPI из библиотеки DLL, которая является своего рода плагином.Как обрабатывать сообщения / события внутри библиотеки DLL VC ++.Обработка событий SAPI показана в примере по адресу:http://msdn.microsoft.com/en-us/library/ms720165%28VS.85%29.aspx
Решение
Для обработки "обычных" сообщений вам все еще нужен объект Window.Это может быть специальное окно "только для сообщений", которое использует инфраструктуру очереди обмена сообщениями только совместно с обычными окнами.Чтобы создать его, сначала зарегистрируйте свой класс обработки сообщений с помощью RegisterClass()
.Затем создайте очередь сообщений, передав HWND_MESSAGE
в качестве родительского окна для CreateWindow()
.Вы получите обратно столько, сколько сможете, а затем отправитесь в SAPI.
Однако SAPI поддерживает и другие интерфейсы.Документация ISpNotifySource называет 4:Сообщения Windows, обратные вызовы, события и COM (ISpNotifySink).Чтобы использовать обратные вызовы, просто передайте адрес одного из ваших методов DLL в SetNotifyCallbackFunction
.
Другие советы
Если ваш код выполняется как плагин, вы можете подумать о том, чтобы SAPI перезвонил вам напрямую, используя ISpNotifySource::setnotifycallbackфункция вместо того , чтобы ISpNotifySource::SetNotifyWindowMessage (Исходный код).Затем SAPI вызовет вашу функцию напрямую, когда произойдет событие.
WndProc используется для получения всех сообщений / событий, направленных в окно.
Ваша DLL-библиотека должна создать окно и ждать сообщений в окне.Если возможно, вам следует реализовать это в вашем основном процессе, или вы можете заставить dll создать отдельный поток, который создавал бы окно и ожидал сообщения, в то время как фактическая функция возвращает управление процессу.