Каков наилучший способ обмена данными между приложениями в Delphi без сокетов? - PullRequest
6 голосов
/ 25 мая 2009

Мне нужно несколько связанных приложений, чтобы общаться друг с другом (обмениваться данными и инициировать действия). Требования без пакетов и без розеток. Так что я думаю, что это оставляет именованные каналы, WM_CopyData (как это делает Skype) и параметры команды. Каковы ваши лучшие практики?

Ответы [ 8 ]

5 голосов
/ 25 мая 2009

Возможно, у вас есть несколько вариантов.

Помимо того, что у вас уже есть:
DDE
Файлы, отображенные в память (MMF)
* 1006 почтовые слоты *

Я бы, наверное, выбрал либо Pipes, либо MMF.

Есть несколько бесплатных MMF-компонентов, которые вы можете скачать, Дебора Пэйт имеет набор бесплатных классов, которые вы можете использовать. MapFiles.zip

Проверка почтовых ящиков на сайте Torry .

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

4 голосов
/ 25 мая 2009

Я бы посоветовал использовать COM в этой ситуации. (Внимание: не COM +, не ActiveX, не OLE; COM, только COM.)

Начиная с Delphi 7 (или более ранней версии, я не уверен), это легко сделать, добавив библиотеку типов в проект и объект автоматизации.

Преимущества заключаются в том, что он довольно широко поддерживается как в Delphi (редактор библиотек типов содержит все необходимое, так и обновляет ваш код, а внутренние компоненты и регистрация COM обслуживаются из модуля ComServ), а также вне Delphi (я использую его в ряд проектов для взаимодействия со всевозможными приложениями: проекты C ++, документы Word и Excel с использованием VBA, oldskool ASP ...).

Единственным недостатком, с которым я столкнулся, могут быть проблемы с многопоточностью, в обычных приложениях простое CoInitialize(nil); при запуске приложения подойдет, в более сложных приложениях вам нужно подумать о «многопоточности» или использовать бесплатную многопоточность и делать свое замок. (Что в некоторых случаях вы уже делали.)

2 голосов
/ 25 мая 2009

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

Конечно, это не очень высокая производительность.

2 голосов
/ 25 мая 2009

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

Не слишком элегантно и требует много накладных расходов, но если ваше приложение уже поддерживает данные (то есть имеет базу данных как часть), то использовать таблицу или две для передачи информации довольно просто.

1 голос
/ 27 мая 2009

Еще один голос от меня за именованные каналы, за обмен данными. Они мне нравятся немного больше, чем файлы mmap, поскольку API-интерфейсы win32 pipe предоставляют вам несколько полезных вариантов: синхронизация / асинхронность, поток байтов против пакетов сообщений, простые вызовы ReadFile / WriteFile. Все, что вы могли бы сделать самостоятельно с помощью mmaps ... но каналы уже есть ...

И вы можете контролировать доступ с помощью атрибутов безопасности - что невозможно с WM_CopyData. Это может не быть проблемой сразу ... но может быть удобно иметь опцию, даже если вам все равно, кто отправляет сообщения вашего приложения. Для меня это было полезно, когда появилась Vista, и внезапно пользовательские приложения запускались в отдельном сеансе для моего сервиса. Хорошо, что настройка атрибутов безопасности была единственной вещью, необходимой для того, чтобы все заработало снова.

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

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

0 голосов
/ 28 мая 2009

Если вы хотите передать данные, вызвать функции и т. Д., Используйте COM, однако, если есть много вызовов, помните, что COM работает медленно. Также вам может потребоваться зарегистрировать приложение в «xxx.exe / Regserver», прежде чем оно будет работать.

0 голосов
/ 26 мая 2009

Разве это не тот вид, который хорош в RemObjects? Bri

0 голосов
/ 25 мая 2009

Не используйте COM, слишком много накладных расходов (варианты), и вы должны зарегистрировать вас .dll или .exe (и это дает много странных проблем с установкой + обновлением).

Я должен пойти на MMF, я использую это для связи со службами Windows. Для этого я использую следующий TGpMessageQueueReader и писатель: http://17slon.com/gp/gp/gpsync.htm

...