2008-12-10 13 views
1

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

владимир 1tuga

+0

Образец кода поможет ... – CheGueVerra 2008-12-10 15:42:54

+1

Похоже, вы не закончили задавать свой вопрос. – 2008-12-10 16:37:21

ответ

5

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

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

What is a Message Loop (нажмите на название, чтобы принять на источник этой информации)

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() возвращает и мы возвращаемся к началу петли.
+0

Хотя это отличная общая информация о обработке сообщений в Windows, она не применяется непосредственно к Delphi, где цикл сообщений и даже фактический объект сообщения обычно скрыты от разработчика. – 2008-12-11 15:24:09

7

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

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

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

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

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

0

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

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