Каков предпочтительный способ передачи данных между двумя приложениями в одной системе? - PullRequest
9 голосов
/ 12 августа 2010

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

Подход открывающейся розетки прямой.

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

Что является лучшим выбором?

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

Ответы [ 6 ]

13 голосов
/ 12 августа 2010

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

  • дисковые файлы
  • труба
  • общая память
  • Сообщения
  • RPC
  • CORBA
  • COM
  • и т.д.
5 голосов
/ 12 августа 2010

Самый простой метод (при условии 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.

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

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

Я бы предложил розетки.

0 голосов
/ 02 сентября 2011

Это может помочь. Обмен файлами и памятью

0 голосов
/ 12 августа 2010

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

0 голосов
/ 12 августа 2010

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

...