Каков предпочтительный способ передать данные между двумя приложениями в той же системе?

У меня есть приложение (A), которое должно запустить другое приложение (B). Я должен передать данные между приложениями. Я могу думать о двух подходах. Первое должно открыть сокет. Второе должно обменяться данными через dll.

Вводный подход сокета является прямым.

dll приближаются, у меня есть некоторые вопросы? Я могу загрузить плагин dlls в B. Я хочу создать dll, который A может использовать для передачи данных B. При загрузке dlls, только один экземпляр загруженного dll? Если так, это означает, что данные могут быть совместно использованы приложениями, которые загружают dll?

Каков лучший выбор?

Есть ли другие способы сделать это?

10
задан zooropa 12 August 2010 в 17:08
поделиться

5 ответов

Вы не можете эффективно обмениваться данными через DLL. Other ways:

  • disk files
  • pipes
  • shared memory
  • messages
  • RPC
  • CORBA
  • COM
  • etc.
14
ответ дан 3 December 2019 в 18:31
поделиться

Самый простой метод (предполагая Windows, поскольку вы упоминаете DLL), вероятно, заключается в использовании CreateProcess и открытии канала к дочернему процессу, как описано в упрощенной форме здесь: http://msdn.microsoft.com/en-us/library/ms682499.aspx

Именованные трубопроводы могут быть альтернативой, особенно если вы не контролируете время жизни всех процессов. http://msdn.microsoft.com/en-us/library/aa365590.aspx

Для простых случаев почтовые слоты могут быть достаточной альтернативой.

http://msdn.microsoft.com/en-us/library/aa365574.aspx#base.using_a_mailslot_for_ipc

Вот более длинный список различных методов межпроцессного взаимодействия для Windows. http://msdn.microsoft.com/en-us/library/aa365574.aspx

Для чего-то, происходящего локально, использование сокетов кажется излишеством. К тому же вам придется реализовать собственный механизм безопасности для предотвращения атак спуфинга, а не полагаться на интегрированный механизм безопасности большинства других методов IPC.

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

Всегда полезно исследовать альтернативные возможные решения, но я лично считаю, что использование сокетов в качестве транспортного уровня для данных между приложениями не только перспективно, но и масштабируемо. Использование сокетов избавит вас от необходимости писать большое количество кода для конкретной ОС, что может помешать вам в будущем переносить ваше приложение на операционные системы, отличные от Windows.

Я бы посоветовал розетки.

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

У вас может быть общий кэш (например, служба windows или скрытый процесс), который может прослушивать - возвращать данные всем подписчикам. Для этого используется паттерн Observer.

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

Я бы согласился с Juan Zamora M, за исключением того, что сервис, предоставляющий данные, должен иметь API, который можно запрашивать по мере необходимости, а не подталкивать при изменении через слушателей.

0
ответ дан 3 December 2019 в 18:31
поделиться
Другие вопросы по тегам:

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