2010-06-02 4 views
4

Мы пытаемся разработать приложение, которое отправляет сообщения службе, но мы отправляем только сообщение между двумя приложениями. Мы развиваемся в Delphi 7, Windows XP.Как отправить сообщение службе?

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

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

ответ

13

Вы не можете отправлять оконные сообщения службе. Во-первых, у служб нет собственного пользовательского интерфейса, не говоря уже о окнах. Во-вторых, даже если вы добавите свое собственное скрытое окно в службу (фактически, службы на основе Delphi имеют скрытое окно TApplication), оконные сообщения не могут проходить через границы сеанса (службы запускаются в отдельном сеансе, чем в режиме пользователя Приложения).

Существует много механизмов IPC (interprocess communication), которые работают с услугами - именованные каналы, почтовые ящики, сокеты TCP/IP и UDP, просто для того, чтобы назвать несколько. Вместо этого вам придется использовать один из них.

+0

Извините, но это неверно. Вы можете отправлять оконные сообщения службе. Нужно только установить соответствующий параметр при создании службы. Затем вы создаете свой собственный обработчик сообщений. И локально, сообщение GDI с WM_COPYDATA быстрее, чем любой другой механизм IPC (по крайней мере, если ваше сообщение - это несколько КБ). Чтобы отправить сообщение обратно в приложение, вы просто используете вызов PostMessage или SendMessage для экземпляра клиента HWND (который был отправлен с первым сообщением). См. Http://synopse.info/fossil/finfo?name=SQLite3/SQLite3Commons.pas и TSQLRestClientURIMessage + TSQLRestServer.ExportServerMessage –

+1

@ A.Bouchez: в каком параметре создания вы конкретно указываете? 'SERVICE_INTERACTIVE_PROCESS'? Этот флаг больше не поддерживается, начиная с Vista. Окно сообщений НЕ МОЖЕТ проходить через границы сеансов (в любой версии Windows). Единственный способ, которым служба может обмениваться сообщениями окна с внешним приложением, - это то, что приложение работает на том же сеансе, что и служба. Службы НЕ запускаются в том же сеансе, что и большинство зарегистрированных пользователей в XP и ранее, и НЕТ пользователей в Vista и позже. –

7

Я предлагаю названные трубы. Кто-то из SO уже предоставил great example in Delphi (есть и другие примеры на этом сайте)

+0

+1 для направления на другой ответ, чем ваш ... :) –

0

Я использую Indy TCP Server с моими службами, а затем могу общаться с одного и того же компьютера или с других компьютеров. Это была возможность добавить. Я отправляю запись туда и обратно, начало записи сообщает серверу, какой тип сообщения и что содержит буфер, и наоборот.

Richard

Смежные вопросы