2010-08-12 3 views
8

Ich habe eine Anwendung (A), die eine andere Anwendung (B) starten muss. Ich muss Daten zwischen den Anwendungen übergeben. Ich kann mir zwei Ansätze vorstellen. Die erste besteht darin, einen Socket zu öffnen. Die zweite besteht darin, Daten über eine DLL zu teilen.Wie wird die Datenübertragung zwischen zwei Anwendungen auf demselben System bevorzugt?

Der Öffnungsansatz ist geradlinig.

Die DLL-Ansatz Ich habe ein paar Fragen? Ich kann Plug-in-DLLs in B laden. Ich möchte eine DLL erstellen, die A verwenden kann, um Daten an B zu übergeben. Wird beim Laden von DLLs nur eine Instanz der DLL geladen? Wenn ja, bedeutet dies, dass Daten zwischen Anwendungen ausgetauscht werden können, die die DLL laden?

Was ist die bessere Wahl?

Gibt es andere Möglichkeiten, dies zu tun?

Antwort

13

Sie können Daten nicht effektiv über eine DLL freigeben. Andere Möglichkeiten:

  • Plattendateien
  • Rohre
  • Shared Memory
  • Nachrichten
  • RPC
  • CORBA
  • COM
  • usw.
+0

Was ist das Problem der Freigabe von Daten über eine DLL? – zooropa

+2

@zoo Es ist sehr schwierig zu kontrollieren, funktioniert nicht, wenn die DLL entladen wird, und erfordert spezielle Kompilierung der DLL - Daten in DLLs wird standardmäßig nicht freigegeben. –

+1

siehe #pragma data_seg für weitere Informationen über das Teilen von Daten zwischen DLLs –

0

Sie können einen gemeinsamen Cache verwenden (z. B. einen Windows-Dienst oder einen versteckten Prozess), der zuhören kann und Daten an alle Teilnehmer zurückgibt. Dies unter Verwendung eines Beobachter-Muster-Ansatzes.

5

Die einfachste Methode (unter der Annahme von Windows, da Sie eine DLL erwähnen) ist wahrscheinlich Createprocess und öffnen Sie ein Rohr mit dem Kind-Prozess zu verwenden, wie hier in vereinfachter Form beschrieben: http://msdn.microsoft.com/en-us/library/ms682499.aspx

Named Pipes kann eine Alternative sein, vor allem wenn Sie nicht die Kontrolle über die Lebensdauer aller Prozesse haben. http://msdn.microsoft.com/en-us/library/aa365590.aspx

Für einfache Fälle können Mailslots eine ausreichende Alternative sein.

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

Hier ist eine längere Liste verschiedener Interprocess Communication Techniken für Windows. http://msdn.microsoft.com/en-us/library/aa365574.aspx

Für etwas passiert lokal, Sockets scheint Art von Overkill. Außerdem müssen Sie Ihren eigenen Sicherheitsmechanismus implementieren, um Spoofing-Angriffe zu verhindern, anstatt vom integrierten Sicherheitsmechanismus der meisten anderen IPC-Methoden abhängig zu sein.

+0

Wussten Sie, dass Sie alte Links gepostet haben? –

+0

Nein, sie kamen alle aus frischen Google-Abfragen, als ich gepostet ... ah, ich sehe, dass die VS-Version in ihnen angegeben ist. Ich glaube nicht, dass sich der Inhalt geändert hat. – JasonTrue

1

Es ist immer gut, alternative mögliche Lösungen zu erforschen, aber ich persönlich glaube, dass die Verwendung von Sockets als Transportschicht für Daten zwischen Anwendungen nicht nur zukunftssicher, sondern auch skalierbar ist. Wenn Sie Sockets verwenden, müssen Sie nicht mehr viel Betriebssystem-spezifischen Code schreiben, der Sie davon abhalten könnte, Ihre Anwendung zukünftig auf Nicht-Windows-Betriebssysteme zu portieren.

Ich würde Sockets vorschlagen.

+1

Es erfordert jedoch, dass Sie umfangreiche Mengen an Betriebssystem-neutralem Code schreiben und dann beibehalten. –

+0

Ja. Punkt genommen :) – carribus

0

Ich würde etwas mit Juan Zamora M zustimmen, außer dass der Dienst, der die Daten bereitstellt, eine API haben sollte, die angefordert werden kann, wenn sie nicht gedrückt wird, wenn sie über Zuhörer geändert wird.

Verwandte Themen