TService не будет обрабатывать сообщения

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

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

10.12.2008 15:39:53
Пример кода может помочь ....
CheGueVerra 10.12.2008 15:42:54
Похоже, вы не закончили задавать свой вопрос.
Rob Kennedy 10.12.2008 16:37:21
3 ОТВЕТА

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

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

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

while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
}
  1. Цикл сообщений вызывает GetMessage (), который просматривает вашу очередь сообщений. Если очередь сообщений пуста, ваша программа в основном останавливается и ждет ее (она блокируется).
  2. Когда происходит событие, приводящее к добавлению сообщения в очередь (например, система регистрирует щелчок мыши), GetMessages () возвращает положительное значение, указывающее, что есть сообщение, которое нужно обработать, и что оно заполнило элементы MSG Структура, которую мы передали. Возвращает 0, если попадает в WM_QUIT, и отрицательное значение, если произошла ошибка.
  3. Мы берем сообщение (в переменной Msg) и передаем его в TranslateMessage (), это делает небольшую дополнительную обработку, переводя сообщения виртуального ключа в символьные сообщения. Этот шаг на самом деле необязателен, но некоторые вещи не будут работать, если его там нет.
  4. Как только это будет сделано, мы передаем сообщение в DispatchMessage (). Функция DispatchMessage () принимает сообщение, проверяет, для какого окна оно предназначено, а затем ищет процедуру окна для этого окна. Затем он вызывает эту процедуру, отправляя в качестве параметров дескриптор окна, сообщения, а также wParam и lParam.
  5. В своей оконной процедуре вы проверяете сообщение и его параметры, и делаете с ними все, что хотите! Если вы не обрабатываете конкретное сообщение, вы почти всегда вызываете DefWindowProc (), который будет выполнять действия по умолчанию для вас (что часто означает, что он ничего не делает).
  6. Как только вы закончили обработку сообщения, ваша оконная процедура вернется, DispatchMessage () вернется, и мы вернемся к началу цикла.
5
10.12.2008 16:37:55
Хотя это хорошая общая информация об обработке сообщений в Windows, она не относится напрямую к Delphi, где цикл обработки сообщений и даже сам объект сообщения обычно скрыты от разработчика.
Scott W 11.12.2008 15:24:09
Что вы имеете в виду "скрытый"? Я могу перевести этот точный код в Delphi (и я делал это в производственных проектах), и WHAM, у меня есть цикл обработки сообщений. Они просто отделены от API, который Delphi может полностью использовать и использовать, как в C / C ++
Mick 12.12.2008 19:20:58
Правда, вы можете сделать это, но я имел в виду, что вам не нужно. Например, я могу создать новый проект с формой и настроить обработчик для определенного типа сообщения. Затем, без каких-либо попыток построить цикл обработки сообщений, мой обработчик получит эти сообщения.
Scott W 13.12.2008 05:09:22
Ты прав. Если вы создаете приложение VCL, это не обязательно. Однако, если вы создаете консольное приложение и хотите отправлять из него оконные сообщения, вам понадобится цикл обработки сообщений.
Mick 15.12.2008 13:34:41

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

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

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

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

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

7
10.12.2008 16:44:57
Сервисы в Delphi DO имеют возможность получать оконные сообщения без создания рассылки сообщений. Чтобы доказать это, создайте службу в Delphi, и вы заметите нечто, создающее форму (например, «скрытое» окно, подобное обычному приложению VCL): Application.CreateForm (TMyService1, MyService1);
Mick 10.12.2008 17:09:54
Тем не менее, он не может получать сообщения от программы, запущенной на другом рабочем столе.
Rob Kennedy 10.12.2008 17:36:31
Да, это так в Windows Vista. Это связано с тем, что служба работает с привилегиями SYSTEM, а ее процесс имеет более высокий IL (уровень целостности), чем приложение, запускаемое пользователем. Можно поднять IL приложения и отправить WM в сервис. Но это невозможно с производственным приложением
Mick 10.12.2008 17:58:02

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

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

0
10.12.2008 18:21:59