![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Mosian |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 17.7.2009 Репутация: нет Всего: нет |
Сервис написан без форм на APi
Необходимо получить системное сообщение об изменении конфигурации Windows (wm_devicechange) В главном потоке сервиса подписываюсь на получение сообщений Registerdevicenotification (handlService, @структура на то что хочу получать, Flag); Где flag = device_notify_window_handle если 1 параметр Окно device_notify_service_handle если 1 параметр сервис (мой случай). Проблема первая (device_notify_service_handle) – пишет Undeclared , а (device_notify_window_handle) проходит объявление в Windows ГДЕ ВЗЯТЬ device_notify_service_handle? Проблема вторая, чем перехватывать эти сообщения? (Может создать поток и вызывать в нём GetMessage) Сильно не судите чайник. |
|||
|
||||
| Virtuals |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 476 Регистрация: 27.11.2006 Репутация: 4 Всего: 11 |
Mosian,
2. wm_devicechange сообщение оконное, соответственно и ловят его окна |
|||
|
||||
| kami |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
DEVICE_NOTIFY_SERVICE_HANDLE = 1 (гугл рулит).
Перекрыть DoCustomControl сервиса. Только насколько я понял из других ссылок (пока искал значение DEVICE_NOTIFY_SERVICE_HANDLE), там не обойтись им, потому что в DoCustomControl передается только msg.WParam. У себя я давно обошел это, если в сервис устанавливается на Win2k или более новую винду, то вызывается не RegisterServiceCtrlHandler, а RegisterServiceCtrlHandlerEx, что позволяет получать дополнительные уведомления от системы. Правда, для этого пришлось влезть в генофонд, ну да ладно - оно того стоило. HandlerEx callback function Добавлено через 1 минуту и 35 секунд
неправда ваша. Добавлено через 4 минуты и 9 секунд Вариант 2: читаем внимательно RegisterDeviceNotification Function:
Вывод: создаем в сервисе окошко (AllocateHWND) и пользуем его. |
||||
|
|||||
| Mosian |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 17.7.2009 Репутация: нет Всего: нет |
Через AllocateHWND пробовал молчит окошко;
Возможно я неправильно передаю в RegisterServiceCtrlHandle Handle сервиса беру его из registerServiceCtrlHandler либо необходимо OpenService? И где правильно вызывать RegisterServiceCtrlHandle в основном потоке либо без разницы |
|||
|
||||
| Mosian |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 17.7.2009 Репутация: нет Всего: нет |
Kami а где взять RegisterServiceCtrlHandlerEx
|
|||
|
||||
| kami |
|
||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
и при этом указывал DEVICE_NOTIFY_WINDOW_HANDLE ?
Добавлено через 12 минут и 13 секунд
Читаем еще раз:
Смотрим, что возвращает RegisterServiceCtrlHandler: SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerEx( __in LPCTSTR lpServiceName, __in LPHANDLER_FUNCTION_EX lpHandlerProc, __in_opt LPVOID lpContext ); то есть, параметр передан правильно. Теперь смотрим на HandlerEx Callback Function
Вывод - если нужно получать не через оконную функцию, а через callback функцию сервиса, то Hander (который регистрируется через RegisterServiceCtrlHandler) ничего не получит, как бы ни старался, тогда только HandlerEx. |
||||||||
|
|||||||||
| Mosian |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 17.7.2009 Репутация: нет Всего: нет |
Люди что я делаю не так HendlerEx не получает сообщения SERVICE_CONTROL_DEVICEEVENT да и другие доп. параметры введённые для данной функции.
Сервис должен реагировать на вкл. выкл. USB Ниже я привёл код, где происходит рег. Функции обработчика сообщ.
Это сообщение отредактировал(а) Rrader - 20.7.2009, 14:56 |
||||
|
|||||
| kami |
|
||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
Неверное объявление. Должно быть:
А в этом коде не видно, что обрабатываются коды SERVICE_CONTROL_DEVICEEVENT Хочу еще обратить внимание на DEV_BROADCAST_DEVICEINTERFACE:
Это во-первых. А во-вторых, нужно учитывать, что dbcc_name:array[0..0] of char; (для сервиса - WideChar) - это сишная структура, которая не мешает обращаться по другим индексам этого массива. В Delphi с этим могут возникнуть проблемы. (меня самого как-то "ткнули носом" в это на другом форуме). Это сообщение отредактировал(а) kami - 20.7.2009, 20:51 |
||||||
|
|||||||
| Mosian |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 17.7.2009 Репутация: нет Всего: нет |
В ServiceCtrlHandler приходят только стандартные сообщенки сервиса (stop start)
Но SERVICE_CONTROL_DEVICEEVENT так и не работает Что может быть
|
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |