TService не будет обрабатывать сообщения
Я создал службу Windows, которая использует Windows Messaging System. Когда я тестирую приложение из отладчика, сообщения проходят хорошо, но когда я его устанавливаю, мой месседж… спросили 14 минут назад
владимир 1туга
3 ответа
Сервисы обычно не получают оконные сообщения. Они не обязательно имеют оконные ручки вообще. Даже если они это сделают, они запускаются на отдельном рабочем столе. Программы не могут отправлять сообщения с одного рабочего стола на другой, поэтому служба может получать сообщения только от другой службы или от программы, запущенной службой.
До Windows Vista вы могли настроить службу для взаимодействия с рабочим столом. Это заставляет службу работать на том же рабочем столе, что и вошедший в систему пользователь, поэтому программа, работающая от имени этого пользователя, может отправлять сообщения в окна вашей службы. Windows Vista изолирует сервисы; они больше не могут взаимодействовать с рабочим столом любого пользователя.
Есть много других способов общения с сервисами. Они включают именованные каналы, почтовые слоты, отображенные в память файлы, семафоры, события и сокеты.
Например, с помощью сокета ваша служба может прослушивать открытый порт, а программы, которым необходимо с ней общаться, могут подключаться к этому порту. Это может открыть дверь для удаленного администрирования, но вы также можете ограничить службу прослушиванием только локальных соединений.
Все вышесказанное пытается сказать вам, что вы используете неправильный подход. Но есть и проблема проблемы. Ваша программа ведет себя так, как в отладчике, так и вне ее. Как вы отлаживаете службу в первую очередь, если она не установлена? На какой учетной записи работает ваша служба? Твой отладчик? Какие методы отладки вы пробовали, которые не включают отладчик (например, writeln
в файл журнала для отслеживания действий вашей программы)?
Что вы имеете в виду, когда говорите, что она "использует" систему обмена сообщениями Windows? Вы используете или отправляете сообщения Windows?
Если вы отправляете сообщение Windows, вам нужно убедиться, что вы делаете это правильно. Я бы посоветовал написать цикл обработки сообщений, чтобы обеспечить правильную отправку сообщений. Я также предложил бы прочитать о циклах сообщений и о том, как они работают.
Что такое цикл сообщений (нажмите на название, чтобы перейти к источнику этой информации)
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
- Цикл сообщений вызывает GetMessage(), который просматривает вашу очередь сообщений. Если очередь сообщений пуста, ваша программа в основном останавливается и ждет ее (она блокируется).
- Когда происходит событие, вызывающее добавление сообщения в очередь (например, система регистрирует щелчок мышью), GetMessages() возвращает положительное значение, указывающее, что есть сообщение, которое необходимо обработать, и что оно заполнило элементы MSG Структура, которую мы передали. Возвращает 0, если попадает в WM_QUIT, и отрицательное значение, если произошла ошибка.
- Мы берем сообщение (в переменной Msg) и передаем его в TranslateMessage(), это делает небольшую дополнительную обработку, переводя сообщения виртуального ключа в символьные сообщения. Этот шаг на самом деле необязателен, но некоторые вещи не будут работать, если его там нет.
- Как только это будет сделано, мы передаем сообщение в DispatchMessage(). Функция DispatchMessage () принимает сообщение, проверяет, для какого окна оно предназначено, а затем ищет процедуру окна для этого окна. Затем он вызывает эту процедуру, отправляя в качестве параметров дескриптор окна, сообщения, а также wParam и lParam.
- В своей оконной процедуре вы проверяете сообщение и его параметры, и делаете с ними все, что хотите! Если вы не обрабатываете конкретное сообщение, вы почти всегда вызываете DefWindowProc(), который будет выполнять для вас действия по умолчанию (что часто означает, что он ничего не делает).
- Как только вы закончили обработку сообщения, ваша оконная процедура вернется, DispatchMessage() вернется, и мы вернемся к началу цикла.
Спасибо всем за ответы, проблема заключалась в операционной системе (Vista), я проверил с моей Windows 2000, и все работает.
спасибо за свет Роб.