2009-05-25 8 views
6

J'ai besoin de quelques unes de mes applications pour communiquer entre elles (échanger des données et lancer des actions). Les exigences sont sans paquets et sans prises. Donc je suppose que ça laisse des tubes nommés, WM_CopyData (comme le fait Skype) et des paramètres de commande. Quelles sont vos meilleures pratiques?Quelle est la meilleure façon de faire l'échange de données d'application dans Delphi sans sockets?

+0

Si je choisis des tubes nommés ou WM_CopyData alors je vais aller avec REMObjects SDK, alors ne répondez pas à cela. Merci. – Mihaela

+0

Vous n'êtes pas à la recherche d'un design, vous recherchez une technologie. –

+0

Vous avez raison. Je pensais au design pattern, mais ma question se concentrait sur la technologie. Le modèle de conception inclurait la technologie déjà choisie et sa mise en œuvre. Merci d'avoir corrigé cela. – Mihaela

Répondre

5

Vous avez probablement quelques options.

Au-delà de ce que vous avez déjà:
DDE
mémoire Fichiers mappée (MMF)
MAILSLOTS

Je serais probablement aller avec soit les tuyaux ou MMF.

Il existe un certain nombre de composants gratuits MMF que vous pouvez télécharger, Deborah Pate dispose d'un ensemble de classes freeware que vous pouvez utiliser. MapFiles.zip

Vérifiez les emplacements MailSlots sur le site Torry's.

La solution finale peut dépendre de la quantité, de la taille et de la fréquence des transferts de données qui déterminent l'option choisie.

4

Je vous conseille d'utiliser COM dans cette situation. (Attention: pas COM +, pas ActiveX, pas OLE, COM, juste COM.)

Depuis Delphi 7 (ou une version antérieure, je ne suis pas sûr), ceci est facilement fait en ajoutant une bibliothèque de types au projet et un objet Automation. Les avantages sont assez largement supportés, à la fois dans Delphi (l'éditeur de bibliothèque de types a tout ce dont vous avez besoin et met à jour votre code, et les composants internes COM et l'enregistrement sont pris en charge par l'unité ComServ) et en dehors de Delphi (je l'utilise dans un certain nombre de projet d'interagir avec toutes sortes d'applications: projets C++, documents Word et Excel en utilisant VBA, ASP oldskool ...). Un CoInitialize(nil); au démarrage de l'application suffira, dans les applications plus complexes, vous devez penser à «enfiler des appartements» ou utiliser des threads libres et faire votre propre verrouillage . (Dans certains cas, vous l'avez déjà fait.)

+0

Notez que CoInitialize() et CoUninitialize() doivent être appelés dans chaque thread qui utilise COM. – mghie

+0

Ceci est une bonne réponse, je préfère ne pas utiliser COM. – Mihaela

+0

Je tiens juste à mentionner que la création simple d'objets COM est disponible depuis Delphi 3. –

0

Ne pas utiliser COM, trop de surcharge (variantes) et vous devez vous enregistrer .dll ou .exe (et cela pose beaucoup de problèmes d'installation et de mise à jour)).

Je devrais aller pour MMF, je l'utilise pour la communication avec Windows Services. J'utilise le TGpMessageQueueReader et écrivain suivant pour cela: http://17slon.com/gp/gp/gpsync.htm

+0

Je vois cela comme un avantage: avec les objets Automation normaux, ComServ gère l'enregistrement pour vous, et si vous le souhaitez, vous pouvez utiliser un objet dérivé de TAutoObjectFactory , vous pouvez ajouter à la méthode UpdateRegistry. (Je l'ai modifié ma réponse à mentionner) –

+0

Aussi, j'utiliser des types indigènes comme BSTR (qui associe bien à WideString en code) et des valeurs numériques, qui exécutent bien, et ne pas avoir des problèmes avec des variantes. (Je ne ai jamais eu aucun problème avec OleVariants de toute façon, qu'est-ce que vous parlez?) –

2

Une autre alternative qui est simple à mettre en œuvre la saleté est d'utiliser la base de données pour transmettre des informations. Il n'est pas très élégant et il utilise beaucoup de frais généraux, mais si votre application est déjà sensible aux données (c'est-à-dire qu'elle contient une base de données), utiliser une table ou deux pour transmettre des informations est assez facile.

2

Vous pouvez utiliser des fichiers simples: un côté écrit, l'autre lit. Si vous avez besoin d'une communication bidirectionnelle, utilisez simplement deux fichiers, un pour chaque direction.

Bien sûr, ce n'est pas vraiment une haute performance.

+0

+1 Communication via des fichiers peut venir une fois très pratique et un certain temps. C'est un moyen facile de communiquer entre différents systèmes d'exploitation, chaque langage de programmation/script le supporte, et c'est l'une des rares méthodes où l'information n'est pas perdue si le lecteur meurt. L'écriture de fichiers avec la date et l'heure peut faire en sorte qu'elle fonctionne comme une file d'attente ou une pile, comme vous le souhaitez. Cela fonctionne très bien tant que vous n'envoyez pas des centaines de messages par seconde, ou si chaque microseconde compte. –

0

is'nt ce genre de ce que RemObjects est bon? Bri

1

Un autre vote de moi pour les tuyaux nommés, pour l'échange de données. Je les aime un peu plus que les fichiers mmap, étant donné que les API de tuyaux de win32 vous donner quelques bons choix de la boîte: sync/async, flux d'octets vs paquets de messages, les appels ReadFile/WriteFile simple. Tout ce que vous pouvez faire vous-même avec mmaps ... mais les tuyaux sont déjà là ...

Et vous pouvez contrôler l'accès avec des attributs de sécurité - ce qui n'est pas une option avec WM_CopyData. Cela peut ne pas être un problème immédiatement ... mais peut être pratique pour avoir l'option, même si vous ne vous souciez pas de savoir qui envoie les messages de votre application. Pour moi, cela a été utile lorsque Vista est arrivé, et soudainement les applications des utilisateurs ont couru dans une session séparée à mon service. C'était bien que l'ajustement des attributs de sécurité était la seule chose nécessaire pour que les choses fonctionnent à nouveau. Pour "initier des actions", vous pourriez être en mesure de sortir avec quelque chose d'aussi facile que certains événements nommés, et ne pas s'inquiéter d'envoyer des messages du tout? Les parties intéressées attendent simplement que cela soit signalé. Personnellement, j'éviterais COM à moins que vous deviez spécifiquement prendre en charge les clients basés sur COM.

0

Si vous souhaitez transmettre des données, appeler des fonctions, etc., utilisez COM, mais s'il y a beaucoup d'appels, sachez que COM est lent. Aussi, vous devrez peut-être enregistrer l'application avec "xxx.exe/Regserver", avant que cela ne fonctionne.

Questions connexes