Compago

...free knowledge

 
  • Increase font size
  • Default font size
  • Decrease font size
Home Manuali Programmazione DDE client e server

DDE client e server

E-mail Stampa PDF

In questo articolo faremo qualche esempio di utilizzo dei componenti TDdeClient e TDdeServer.

Per tecnologia DDE si intende Dynamic Data Exchange (dall’inglese scambio dinamico dei dati), cioè uno scambio di dati tra processi.

DDE permette a due applicazioni in esecuzione di condividere un insieme di dati.

Questo normalmente non può accadere per via della virtualizzazione dello spazio di memoria, per cui ogni processo può leggere e scrivere dati nella sua memoria virtuale, ma mai su quella di un altro processo.
Il problema è che molte applicazione hanno la necessità invece di comunicare tra loro, e per farlo senza l'uso di file esterni in comune si sono inventati il DDE.

Un esempio di scambio dinamico dei dati è quello tra i dati di un foglio di calcolo in un documento creato con un elaboratore testi, dove una modifica dei dati in una applicazione viene trasmessa direttamente all'altra.

La tecnologia DDE ha rappresentato l'inizio di questo modo di concepire lo scambio di dati, dato che ora le sue funzionalità sono state in gran parte soppiantate da OLE. Tuttavia DDE è ancora utilizzato in alcuni ambiti per via della sua semplicità; ad esempio è il meccanismo usato da Windows Explorer per comunicare ad un’applicazione già aperta di aprire un nuovo file (altrimenti il nuovo file verrebbe aperto in una nuova istanza dell’applicazione).

Ora quello per cui io la trovo ancora interessante è proprio la sua semplicità di utilizzo, infatti i componenti che si trovano nell' IDE di delphi, nonostante la scarsa documentazione al riguardo, sono molto semplici da usare.

Vediamo di fare un esempio:

Vogliamo creare due applicazioni; una deve fare da client e una da server e tutto quello che viene digitato nel server deve comparire nel client e viceversa.

In entrambe le applicazioni costruiamo l'interfaccia grafica e aggiungiamo nel client un TDdClientConv e un TDdeClientItem e nel server TDdServerConv e un TDdeServerItem. Gli Item devono essere connessi al rispettivo componente Conv.

La comunicazione dal server al client avverrà usando il campo di testo del suo Item, il quale sarà connesso all'item del client, per cui ogni modifica sul primo si riperquote sul secondo.

La comunicazione dal client al server invece facciamo in modo che avvenga usando la funzione del client ExecuteMacro, in questo modo invio come parametro la o le stringhe che voglio trasmettere al server.

Il server è relativamente semplice dato che dovremo solo creare un handler per l'evento OnExecuteMacro e inviare i dati modificando il ServerItem.

procedure TForm1.DdeServerConv1ExecuteMacro(Sender: TObject; Msg: TStrings);
begin
  Memo1.Lines:=Msg;
end;
procedure TForm1.Edit2Change(Sender: TObject);
begin
  DdeServerItem1.Text:=Edit2.Text;
end;

Nel client invece le cose si fanno più complicate dato che dovremo impostare tutti i dati per la connessione al server e il link all'item. Per motivi di maggior chiarezza ho deciso di separarle.

ConnectMode := ddeManual;            
SetLink('server', 'ddeserverconv1');
OpenLink;

L'impostazione del link al server ha due parametri, il primo è il nome dell'applicazione server senza l'estensione ".exe", quindi dato che nel nostro caso l'applicazione si chiama "server.exe" dovremo inserire solo "server".
Il secondo parametro invece contiene il nome dell'istanza della classe TDdeServerConv usata nel server, che nel nostro caso è DdeServerConv1.
Se le due applicazioni fossero in cartelle diverse dovremo impostare anche il campo ServiceApplication che sarà il percorso più il nome dell'applicazione server senza l'estensione (esempio: "C:\prova\server").

DdeClientItem1.DdeItem := 'DdeServerItem1';

Il questo modo i due item saranno interconnessi e quindi quando verrà modificato il testo nell'item del server questo verrà trasmesso al item del client che si occuperà di visualizzarlo.

procedure TForm1.DdeClientItem1Change(Sender: TObject);
begin
  // When the client item will be changed then update memo
  memo1.Lines[1]:=DdeClientItem1.Text;
end;

Infine dovremo inviare il testo dal client al server con la funzione ExecuteMacro:

DdeClientConv1.ExecuteMacroLines(list,false);

Il risultato sarà che tutto quello che verrà scritto in un client, dopo averlo connesso al DdeServer, verrà visualizzato nel server, e viceversa quello che verrà scritto nel server verrà visualizzato nel client.
Nel caso avessimo più client connessi allo stesso server, quello che accadrà è che essi riceveranno contemporaneamente gli stessi dati dal server e ognuno di essi trasmetterà normalmente i suoi dati al server.

Allego i due progetti di Client e Server che usano la tecnologia DDE per comunicare tra loro.

Attachments:
Download this file (DDE client-server.zip)DDE client-server.zip[ ]478 Kb
Ultimo aggiornamento ( Sabato 31 Luglio 2010 10:28 )  
Loading

Login




Chiudi