2010-08-12 7 views
8

J'ai une application (A) qui a besoin de lancer une autre application (B). J'ai besoin de transmettre des données entre les applications. Je peux penser à deux approches. Le premier est d'ouvrir une socket. Le second est de partager des données via une DLL.Quelle est la manière préférée de transmettre des données entre deux applications sur le même système?

L'approche de la douille d'ouverture est simple.

L'approche dll J'ai quelques questions? Je peux charger des DLL de plug-in dans B. Je veux créer une DLL que A peut utiliser pour transmettre des données à B. Lors du chargement des DLL, une seule instance de la DLL est-elle chargée? Si oui, cela signifie-t-il que les données peuvent être partagées entre les applications qui chargent la DLL?

Quel est le meilleur choix?

Y a-t-il d'autres façons de procéder?

Répondre

13

Vous ne pouvez pas partager efficacement des données via une DLL. Autres façons:

  • fichiers disque
  • tuyaux
  • mémoire partagée
  • messages
  • RPC
  • CORBA
  • COM
  • etc.
+0

Quel est le problème de partage de données via une DLL? – zooropa

+2

@zoo Il est très difficile de contrôler, ne fonctionne pas si la DLL est déchargée et nécessite une compilation spéciale de la DLL - les données dans les DLL ne sont pas partagées par défaut. –

+1

regardez dans #pragma data_seg pour plus d'informations sur le partage de données entre dll –

0

Vous pouvez avoir un cache partagé (par exemple un service Windows ou un processus caché) qui peut être à l'écoute - renvoyer des données à tous les abonnés. Ceci en utilisant une approche de modèle Observer.

5

La méthode la plus simple (en supposant Windows depuis que vous mentionnez une DLL) est probablement utiliser CreateProcess et ouvrir un tuyau au processus de l'enfant, tel que décrit sous une forme simplifiée ici: http://msdn.microsoft.com/en-us/library/ms682499.aspx

canaux nommés ne peuvent être une alternative, en particulier si vous n'avez pas le contrôle de la durée de vie de tous les processus. http://msdn.microsoft.com/en-us/library/aa365590.aspx

Pour les cas simples, les mailslots peuvent constituer une alternative suffisante.

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

Voici une liste plus longue de diverses techniques de communication interprocess pour Windows. http://msdn.microsoft.com/en-us/library/aa365574.aspx

Pour quelque chose qui se passe localement, l'utilisation de sockets semble un peu exagéré. De plus, vous devez implémenter votre propre mécanisme de sécurité pour éviter les attaques par usurpation, plutôt que de dépendre du mécanisme de sécurité intégré de la plupart des autres méthodes IPC.

+0

Saviez-vous que vous avez posté des liens anciens? –

+0

Non, ils sont tous venus de nouvelles requêtes Google lorsque j'ai posté ... ah, je vois que la version VS est spécifié en eux. Je ne pense pas que le contenu ait changé. – JasonTrue

1

Il est toujours bon d'explorer d'autres solutions possibles, mais je crois personnellement que l'utilisation de sockets comme couche de transport pour les données entre les applications est non seulement évolutive, mais aussi évolutive. L'utilisation de sockets élimine le besoin d'écrire de grandes quantités de code spécifique au système d'exploitation, ce qui pourrait vous empêcher de porter votre application à l'avenir sur des systèmes d'exploitation autres que Windows.

Je suggère des douilles.

+1

Cependant, il faudra que vous écrivez de grandes quantités de code OS-neutre, puis le maintenir. –

+0

Oui. Point pris :) – carribus

0

Je serais d'accord avec Juan Zamora M sauf que le service fournissant les données devrait avoir une API qui peut être demandée en cas de besoin non poussée lorsqu'elle est modifiée via les écouteurs.

Questions connexes