Les liaisons Dde

Tony Baheux

Le DDE (Dynamic Data Exchange soit en Français échange de donnée dynamique) permet à deux applications (voir plus) de communiquer entre elle. Notez qu'il ne faut pas le confondre avec OLE qui est une autre façon de procéder mais cela est une autre histoire. Mon but ici, n'est pas de vous montrer quelle utilisation vous pouvez en faire, mais de vous apprendre à la mettre en oeuvre et d'apprendre quelques termes. Ce qui est relativement facile avec delphi.

- Titre : Les liaisons Dde

- Auteur : Tony Baheux

- Parution : 1 janvier 2005

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2005 Tony Baheux. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- I-A. Composants

- I-B. Utilisation

- II. Partie Serveur

- III. Partie Cliente

- IV. Cas particulier : Serveur Non-Delphi

- IV-A. Serveur Non-Delphi

- IV-B. Client Non-Delphi

- V. 5. Conclusion

I - Introduction

Le DDE permet à deux applications de communiquer entre elles. Les applications doivent être lancées. L'une des applications est alors serveur tandis que les autres sont clients. Le serveur peut aussi être le client d'autres applications. La façon dont communiquent les applications peut être de deux types. Soit les clients appellent le serveur à chaque fois qu'ils ont besoin d'une information, soit le serveur informe le client des nouvelles informations disponibles.

Liaison DDE - Vue d'ensemble des liaisons possibles.

I-A - Composants

Dans Delphi, vous trouverez les composants dans l'onglet Système. Ils sont au nombre de quatre et permettent de réaliser des applications utilisant le DDE.

Composant_DDE

Dans l'ordre, on trouve : DdeServerConv, DdeServerItem, DdeClientConv et DdeClientItem.

I-B - Utilisation

Le DdeServerConv et le DDeClientConv permet d'établir la conversation entre un client et son serveur. Mais il faut en plus ajouter les DdeServerItem et DdeClientItem pour permettre l'échange de donnée. En fonction du nombre de donnée à échanger, on ajoute autant de DdeServerItem que de DdeCLientItem.

Les deux composants DdeServerItem et DdeClientItem proposent les propriétés suivantes : Lines de type TStrings et Text de type TString.

L'une ou l'autre des propriétés est à utiliser en fonction de la taille de la donnée à échanger (la propriété Text de type TString est limitée à 255 caractères).

II - Partie Serveur

Nous allons commencer par la partie Serveur pour deux choses. La première, une fois le serveur réalisé, nous saurons quel type de donnée, nous voulons échanger. La deuxième lors de l'exécution ou du débogage du client, le serveur peut être chargé automatiquement.

Dans votre projet, ajouter un composant DdeServerConv et autant de DdeServerItem que de donnée à échanger.

Attention, point important :
Vous n'êtes pas obligé d'ajouter de Composant DdeServerConv, dans ce cas c'est la fiche contenant les DdeServerItem qui sert de serveur. Le problème est que c'est le titre de la fiche qui est utilisé pour identifier le serveur. Si par malheur vous changer le titre de la fiche, vous rompez la communication. Ce genre de gag, peut vous faire passer des nuits blanches à chercher l'origine du problème. Donc à moins que vous ne vouliez tenter le diable, utilisez toujours un DdeServerConv pour identifier le serveur.

Pour mettre les nouvelles données dans les DdeServerItem, une simple affectation suffit.

procedure TForm1.Edit1OnChange(Sender : TObject);
begin
DdeServerItem1.Text := Edit1.Text;
end;

Il ne reste plus qu'à changer les propriétés des DdeServerItem et la partie serveur sera terminée. Donc ne perdons pas un instant et modifions la propriété ServerConv, en indiquant soit le nom du composant DdeServerConv, soit le nom du projet sans l'extension.

Propriété de DdeClientItem1

III - Partie Cliente

Passons maintenant à la partie client. Ajoutez un composant DdeClientConv (obligatoire cette fois-ci) et autant de composant DdeClientItem que de DdeServerItem dont vous voulez récupérer la valeur.

Modifiez ensuite les propriétés du DdeClientConv.

DdeClientConv

- Positionnez la propriété ConnectMode à DdeManual

- Double cliquez sur DdeService.

DdeService

- Dans la partie Service indiquer le nom de l'application serveur sans l'extension.

- Dans la partie Rubrique indiquer le nom du composant DdeServerConv (ou le titre de la fiche si vous n'avez pas suivit mon conseil).

- Dans la rubrique Service application, indiquez de nouveau le nom de l'application serveur sans l'extension. Vous pouvez indiquer le chemin complet si elle n'est pas dans le même répertoire que l'application cliente.

Modifier ensuite les propriétés de Chaque DdeClientItem.

DdeClientItem

- Dans DdeConv indiquez le DdeServerConv ou le nom de la fiche serveur.

- Dans DdeItem indiquez le nom du composant DdeServerItem.

- RePositionner la propriété ConnectMode à DdeAutomatic du DdeClientConv.

Si vous avez correctement fait les choses, l'application serveur doit se charger.

Dans l'événement Onchange du DdeClientItem, tapez le code suivant :

procedure TForm1.DdeClientItem1Change(Sender: TObject);
begin
// Récupère les informations du serveur et les place dans Edit1

Edit1.Text := DdeClientItem1.text;
end;

Lancez votre application cliente. Normalement l'application serveur est déjà chargée, si ce n'est pas le cas vérifier les propriétés du DdeClientConv.

Arrangez-vous pour voir les deux applications en même temps. Modifiez le texte dans l'application serveur, vous pouvez voir que les modifications sont répercutées dans l'application cliente.

IV - Cas particulier : Serveur Non-Delphi

Vous me direz c'est bien gentil mais que faire si le serveur n'est pas une application Delphi. Dans ce cas, il reste une solution à condition de 'Bien' connaître l'application serveur. En effet, pour pourvoir communiquer avec le serveur, vous devez :

- Connaître le nom du serveur. C'est la partie facile car il s'agit du nom de l'application sans l'extension.

- Connaître le nom du service. C'est là qu'il faut connaître l'application serveur.

- Connaître le sujet ou topic. Correspond aux données que vous voulez récupérer.

IV-A - Serveur Non-Delphi

Exemple d'une application Cliente en Delphi communicant avec le gestionnaire de programme donc un programme Windows.

Dans votre application cliente, ajouter un DdeClientConv, DdeClientItem, une listBox.

Initialiser les propriétés de DdeClientConv :

- à ddeManuel (permet de dire à Delphi d'attendre la fin des changements).

- Double cliquez sur DdeService et indiquez : Progman dans service et sujet.

- Dans service application entrez Progman

- Modifier aussi le composant DdeClientItem,

- Dans DdeConv, indiquez le nom du DdeClientConv,

- Dans DdeItem, indiquez Groups

- Remettez ConnectMode à DdeAutomatic (On a finit les modifications et Delphi peut appliquer les changements).

Dans l'événement OnChange du DdeClientItem, faire une boucle parcourant touts les éléments de DdeCLientItem.Lines et les ajouter dans la ListBox.

procedure TForm1.DdeClientItem1Change(Sender: TObject);
var
i : integer;
begin
// Récupère les informations du serveur et les placent dans ListBox1

for i := 0 to DdeClientItem1.Lines.Count - 1 do
begin
ListBox1.Lines.Add(DdeClientItem1.Lines[i]);
end;
end;

IV-B - Client Non-Delphi

L'exemple suivant, utilise HTBasic. Je doute que beaucoup de monde l'utilise mais ainsi vous verrez que vos applications peuvent communiquer avec une application conçue dans n'importe quel autre langage de programmation du moment qu'il gère les liaisons DDE. Et puis il n'y a pas que Delphi et Visual C/C++ dans la vie.

INTEGER Result,Ch1,Ch2
DIM Ret$[256],Htbvers$[80]

Htbvers$=SYSTEM$("VERSION:HTB")
IF POS(Htbvers$,"9") THEN
Htbvers$="9"
ELSE
Htbvers$="5"
END IF
CLEAR SCREEN
! Charge la librairie DDE correspondant à la version du HTB, seulement si elle n'est pas déjà chargée.
IF NOT INMEM("Ddeinit") THEN
SELECT Htbvers$
CASE "5"
LOADSUB ALL FROM "htbdde.csb"
CASE "9"
LOADSUB ALL FROM "htb8dde.csb"
END SELECT
PRINT
PRINT " BASIC DDE Client CSUB (R"&Htbvers$&") est chargé.."
END IF

CALL Ddeinit(Result)
IF Result=0 THEN
DISP "Doing some DDE conversation.."
! WAIT 2

! Connexion à l'application, retourne un numéro de canal dans Ch
CALL Ddeconnect(Ch1,"ServeurPrj","DdeServerConv1")
IF Ch1<>0 THEN
! Se reconnecte avec un autre canal
CALL Ddeconnect(Ch2,"ServeurPrj","DDeServerConv1")
CALL Dderequest(Ch2,"DDeServerItem1",Ret$,Result) ! récupère la valeur
CALL Ddeterminate(Ch2,Result)                     ! Termine la connexion sur le second canal
CALL Ddeterminate(Ch1,Result)     ! Sur le premier
ELSE
BEEP
Buf$="ServeurPrj DDE connexion échouée"
END IF

CALL Ddeclean(Result)      ! Libère les ressources DDE
ELSE
BEEP
Buf$="DDE initialisation échouée"
END IF
CLEAR SCREEN
PRINT Ddeinfo$
PRINT "Valeur du serveur: ";Ret$;
PRINT
PRINT Buf$
PRINT "DDE Test terminé"
DELSUB Ddeinit TO END
END

V - 5. Conclusion

Pour réaliser une connexion Manuel, c'est-à-dire qui demande les informations. Il suffit de placer ConnectMode à DdeManual pour le DdeClientConv. Ensuite, lors que l'on veut récupérer les données, on invoque l'instruction RequestData.

Notez qu'il n'est plus nécessaire d'avoir des DdeClientItems dans ce cas.

Avec peu d'effort, vous pouvez rendre vos applications communicantes que se soit des serveurs ou des clients d'autre application et ce quels que soient leurs langages.

Sommaire