TService не будет обрабатывать сообщения - PullRequest
1 голос
/ 10 декабря 2008

Я создал службу Windows, которая использует Windows Messaging System. Когда я тестирую приложение из отладчика, сообщения проходят хорошо, но когда я его устанавливаю, мое сообщение… спрашивается 14 минут назад

владимир 1туга

Ответы [ 3 ]

7 голосов
/ 10 декабря 2008

Сервисы обычно не получают оконные сообщения. Они не обязательно имеют оконные ручки вообще. Даже если они это сделают, они запускаются на отдельном рабочем столе. Программы не могут отправлять сообщения с одного рабочего стола на другой, поэтому служба может получать сообщения только от другой службы или от программы, запущенной службой.

До выхода Windows Vista вы могли настроить службу для взаимодействия с рабочим столом. Это заставляет службу работать на том же рабочем столе, что и вошедший в систему пользователь, поэтому программа, работающая под этим пользователем, может отправлять сообщения в окна вашей службы. Windows Vista изолирует сервисы; они больше не могут взаимодействовать с рабочим столом любого пользователя.

Есть много других способов общения с сервисами. Они включают именованные каналы, почтовые слоты, отображенные в память файлы, семафоры, события и сокеты.

Например, с помощью сокета ваша служба может прослушивать открытый порт, а программы, которым необходимо с ней общаться, могут подключаться к этому порту. Это может открыть дверь для удаленного администрирования, но вы также можете ограничить службу прослушиванием только локальных соединений.

Все вышесказанное пытается сказать вам, что вы используете неправильный подход. Но есть и проблема проблемы. Ваша программа ведет себя так, как в отладчике, так и вне ее. Как вы отлаживаете службу в первую очередь, если она не установлена? На какой учетной записи работает ваша служба? Твой отладчик? Какие методы отладки вы использовали, которые не включают отладчик (например, writeln в файл журнала для отслеживания действий вашей программы)?

5 голосов
/ 10 декабря 2008

Что вы имеете в виду, когда говорите, что «использует» систему сообщений Windows? Вы используете или отправляете сообщения Windows?

Если вы отправляете сообщение Windows, вам нужно убедиться, что вы делаете это правильно. Я бы посоветовал написать цикл обработки сообщений, чтобы обеспечить правильную отправку сообщений. Я также предложил бы прочитать о циклах сообщений и о том, как они работают.

Что такое цикл обработки сообщений (щелкните заголовок, чтобы получить источник этой информации)

while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
}
  1. Цикл сообщений вызывает GetMessage (), который смотрит в вашу очередь сообщений. Если очередь сообщений пуста, программа в основном останавливается и ждет за одного (это блокирует).
  2. Когда происходит событие, вызывающее сообщение будет добавлено в очередь (например, система регистрирует щелчок мыши) GetMessages () возвращает положительное значение, указывающее на наличие сообщение для обработки, и что это заполнил членов МГЗС Структура, которую мы передали. Возвращает 0 если он попадает в WM_QUIT, и отрицательный значение, если произошла ошибка.
  3. Мы принимаем сообщение (в сообщении переменная) и передать его TranslateMessage (), это немного дополнительной обработки, перевод виртуальных ключевых сообщений в символьные сообщения. Этот шаг на самом деле необязательно, но наверняка все не будет работать, если его там нет.
  4. Как только это будет сделано, мы передаем сообщение DispatchMessage (). Какие DispatchMessage () делает это взять сообщение, проверяет, какое это окно и затем смотрит в окно Процедура для окна. Тогда вызывает эту процедуру, отправляя как параметры дескриптора окна, сообщение, и wParam и lParam.
  5. В вашем окне процедуры вы проверяете сообщение и его параметры, и делай с ними что хочешь! Если вы не обращаетесь с конкретным сообщение, вы почти всегда звоните DefWindowProc (), который будет выполнять стандартные действия для вас (которые часто означает, что ничего не делает).
  6. Как только вы закончили обработку сообщение, ваша процедура windows возвращает, DispatchMessage () возвращает, и мы вернемся к началу петля.
0 голосов
/ 10 декабря 2008

Спасибо всем за ответы, проблема заключалась в операционной системе (Vista), я протестировал Windows 2000, и все работает.

спасибо за светлый Роб.

...