Я могу добавить другой для 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!
Лучше всего использовать именованные каналы , вам, вероятно, придется взглянуть на обмен данными на разных уровнях целостности .
В этой статье рассказывается, как это сделать в Vista. Хотя он написан на C ++, это всего лишь базовые вызовы Windows API, поэтому он должен достаточно быстро переводиться в Delphi.
Если вы хотите найти дополнительную информацию по этому вопросу, это сообщение называется Inter Process Communication, но более удачным поисковым термином является IPC. .
Используя 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 и более поздних версиях.
Взгляните на ответы в Обмен данными между двумя приложениями через ПК в локальной сети , что в настоящее время является одним и тем же вопросом. Локальная связь через TCP является стандартной. Как я сказал в своем ответе, решения, использующие интерфейсы типа «Удаленный вызов процедур», работают хорошо. Я использую RemObjects SDK для такого рода вещей, и он позволяет легко расширить управление по сети, если вы захотите позже.
Оба они позволяют вам создать соединение, которое для большей части вашего кода является «прозрачным», и вы просто вызываете интерфейс, который отправляет данные по сети и возвращает результаты.
Я не пробовал, но думаю, вы можете использовать именованные каналы.
Вы должны изменить пользователя службы с локальной системы на сетевую, и тогда служба сможет использовать TCPIP. У меня есть несколько служб, которые используют TCPIP для внешнего управления. Просто убедитесь, что ваш сервисный порт настраивается, чтобы вы могли справиться с любыми конфликтами.
Некоторые из моих интерфейсов управления основаны на страницах XML, обслуживаемых внутренним HTTP-сервером. Это позволяет мне удаленно проверять статус службы с помощью любого веб-браузера, который может подключиться к порту на этом компьютере. Преимущество использования HTTP по сравнению с другими методами заключается в том, что он хорошо работает, когда вам нужно работать с существующим сетевым оборудованием.
Если ваш ТОЛЬКО будет взаимодействовать локально, то именованные каналы, почтовые слоты или файл с отображением памяти может быть лучшим методом.
Я использую в своих служебных приложениях набор компонентов, бесплатное ПО с исходным кодом под названием Simple IPC.
Поиск torry.net. Он очень хорошо работал во всех моих сервисных приложениях при взаимодействии с настольным приложением.
Джон