Delphi 2009: Как установить связь между службой Windows и настольным приложением под Vista? - PullRequest
5 голосов
/ 11 августа 2009

Как приложение для настольного компьютера может взаимодействовать со службой Windows в Vista / Windows2008 / Windows7? Приложению необходимо отправить небольшие строки в службу и получить ответы на строки обратно. Оба написаны на Delphi 2009. (Пожалуйста, предоставьте также пример кода)

Ответы [ 6 ]

6 голосов
/ 11 августа 2009

Можно выбрать именованные каналы , вам, вероятно, придется взглянуть на связь между различными уровнями целостности .

В этой статье рассматривается, как это сделать в Vista. Хотя он написан на c ++, это всего лишь базовые вызовы Windows API, поэтому он должен переводиться достаточно быстро на Delphi.

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

5 голосов
/ 11 августа 2009

Используя Indy, вы можете относительно легко создать TCP-соединение между вашими приложениями. Особенно, если вам нужно только отправить строковые сообщения. Для клиента (в вашем случае настольное приложение) это в основном

var
  Client : TIdTCPClient;
...
Client.Host := 'localhost';
Client.Port := AnyFreePortNumber;
Client.Connect;
Client.IOHandler.Writeln (SomeString);
Response := Client.Readln;
...
Client.Disconnect;

Для сервера (будет услуга в вашем случае)

var
  Server  : TIdTCPServer;
  Binding : TIdSocketHandle;
...
Server.DefaultPort := SameFreePortNumberAsInClient;
Binding := Server.Bindings.Add;
Binding.IP := '127.0.0.1';    
Binding.Port := Server.DefaultPort;
Server.OnConnect := HandleConnection;
Server.OnDisconnect := HandleDisconnection;
Server.OnExecute := HandleCommunication;
Server.Active := True;

Просто внедрите метод HandleCommunication. Он вызывается всякий раз, когда клиент решает что-то отправить. Пример:

procedure MyClass.HandleCommunication (AContext : TIdContext);
var
  Request : String;
begin
  Request := AContext.Connection.IOHandler.Readln;
  if (Request = Command1) then
    HandleCommand1
  else if (Request = Command2) then
    HandleCommand2
  ...
end;

IIRC службе разрешено иметь только графический интерфейс пользователя ИЛИ иметь доступ к сети, поэтому это может быть проблемой, если вашей службе требуется графический интерфейс (которого в любом случае следует избегать, см. Этот вопрос ). Я не знаю, как это делается в Windwos Vista и позже.

3 голосов
/ 11 августа 2009

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

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

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

3 голосов
/ 11 августа 2009

Посмотрите на ответы в Обмен данными между двумя приложениями на ПК в локальной сети , что в настоящее время является практически одним и тем же вопросом. Локальная связь через TCP является стандартной. Как я уже сказал в своем ответе, решения, использующие интерфейсы типа «Удаленный вызов процедур», работают хорошо. Я использую RemObjects SDK для такого рода вещей, и его можно легко расширить для управления через сеть, если вы захотите позже.

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

2 голосов
/ 11 августа 2009

Я не пробовал, но думаю, вы могли бы использовать именованные каналы.

1 голос
/ 12 августа 2009

Я использую в своих сервисных приложениях набор компонентов, бесплатный с исходным кодом под названием Simple IPC.

Поиск torry.net. Он очень хорошо работал во всех моих сервисных приложениях при взаимодействии с настольным приложением.

John

...