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

Я могу добавить другой для Python:

, Учитывая список l = [l1, l2, ..., ln], тогда repr(l) = [repr(l1), repr(l2), ..., repr(ln)], но str(l) != [str(l1), str(l2), ..., str(ln)] (str(l) = repr(l)). Это было решено, потому что там мог быть неясными записями в списке как l = ["foo], [bar,", "],["], и str(l) возвратится "[foo], [bar, ], []", который "мог смутить пользователей". Однако это делает str невозможный использовать для того, чтобы просто вывести данные, так как список уничтожает "просто данные дампа в читаемом формате". Augh!

5
задан Davy Landman 11 August 2009 в 19:24
поделиться

6 ответов

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

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

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

6
ответ дан 18 December 2019 в 07:55
поделиться

Используя 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 и более поздних версиях.

5
ответ дан 18 December 2019 в 07:55
поделиться

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

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

3
ответ дан 18 December 2019 в 07:55
поделиться

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

2
ответ дан 18 December 2019 в 07:55
поделиться

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

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

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

3
ответ дан 18 December 2019 в 07:55
поделиться

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

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

Джон

1
ответ дан 18 December 2019 в 07:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: