Informazioni su Dynamic Data Exchange

Windows offre diversi metodi per il trasferimento di dati tra applicazioni. Un metodo consiste nell'usare il protocollo DDE (Dynamic Data Exchange). Il protocollo DDE è un set di messaggi e linee guida. Invia messaggi tra applicazioni che condividono dati e usa la memoria condivisa per scambiare dati tra applicazioni. Le applicazioni possono usare il protocollo DDE per i trasferimenti di dati monouso e per gli scambi continui in cui le applicazioni inviano aggiornamenti l'una all'altra man mano che diventano disponibili nuovi dati.

Windows supporta anche Dynamic Data Exchange Management Library (DDEML). DDEML è una libreria a collegamento dinamico (DLL) che le applicazioni possono usare per condividere i dati. DDEML fornisce funzioni e messaggi che semplificano l'attività di aggiunta di funzionalità DDE a un'applicazione. Anziché inviare, registrare ed elaborare direttamente i messaggi DDE, un'applicazione usa le funzioni DDEML per gestire le conversazioni DDE. Una conversazione DDE è l'interazione tra applicazioni client e server.

DDEML offre anche una funzionalità per la gestione delle stringhe e dei dati condivisi dalle applicazioni DDE. Anziché usare atom e puntatori a oggetti di memoria condivisa, le applicazioni DDE creano e scambiano handle stringa, che identificano stringhe e handle di dati, che identificano gli oggetti memoria. DDEML consente anche a un'applicazione server di registrare i nomi di servizio supportati. I nomi vengono trasmessi ad altre applicazioni nel sistema, che possono usare i nomi per connettersi al server. DDEML garantisce inoltre la compatibilità tra le applicazioni DDE forzandole a implementare il protocollo DDE in modo coerente.

Le applicazioni esistenti che usano il protocollo DDE basato su messaggi sono completamente compatibili con quelle che usano DDEML. Ovvero, un'applicazione che usa DDE basata su messaggi può stabilire conversazioni ed eseguire transazioni con applicazioni che usano DDEML. A causa dei numerosi vantaggi di DDEML, le nuove applicazioni devono usarlo anziché i messaggi DDE. Per usare gli elementi API di DDEML, è necessario includere il file di intestazione DDEML nei file di origine, collegarsi alla libreria DDEML e assicurarsi che la libreria di collegamento dinamico DDEML si trovi nel percorso di ricerca del sistema.

In questa sezione vengono illustrati gli argomenti seguenti.

Dynamic Data Exchange Protocol

Poiché Windows dispone di un'architettura basata su messaggi, il passaggio dei messaggi è il metodo più appropriato per il trasferimento automatico delle informazioni tra applicazioni. Tuttavia, i messaggi contengono solo due parametri (wParam e lParam) per il passaggio dei dati. Di conseguenza, questi parametri devono fare riferimento indirettamente ad altre parti di dati quando più di poche parole di informazioni passano tra le applicazioni. Il protocollo DDE definisce esattamente come le applicazioni devono usare i parametri wParam e lParam per passare parti di dati più grandi tramite atom globali e handle di memoria condivisa. Il protocollo DDE include regole specifiche per l'allocazione e l'eliminazione di atomi globali e oggetti di memoria condivisa.

Un atomo globale è un riferimento a una stringa di caratteri. Nel protocollo DDE, gli atom identificano le applicazioni che scambiano dati, la natura dei dati scambiati e gli elementi di dati stessi. Per altre informazioni sugli atomi, vedere Informazioni sugli atomi.

Usi per Windows Dynamic Data Exchange

DDE è più appropriato per gli scambi di dati che non richiedono l'interazione dell'utente in corso. In genere, un'applicazione fornisce un metodo per consentire all'utente di stabilire il collegamento tra le applicazioni che scambiano dati. Una volta stabilito il collegamento, tuttavia, le applicazioni scambiano dati senza ulteriore coinvolgimento dell'utente.

DDE può essere usato per implementare un'ampia gamma di funzionalità dell'applicazione, ad esempio:

  • Collegamento a dati in tempo reale, ad esempio aggiornamenti del mercato azionario, strumenti scientifici o controllo del processo.
  • Creazione di documenti composti, ad esempio un documento di elaborazione delle parole che include un grafico prodotto da un'applicazione grafica. Usando DDE, il grafico cambierà quando i dati di origine vengono modificati, mentre il resto del documento rimane invariato.
  • Esecuzione di query sui dati tra applicazioni, ad esempio un foglio di calcolo che esegue query su un database per gli account scaduti.

Scambio di dati dinamici dal punto di vista dell'utente

L'esempio seguente illustra come due applicazioni DDE possono cooperare, come illustrato dal punto di vista dell'utente.

Un utente di un foglio di calcolo vuole utilizzare Microsoft Excel per tenere traccia del prezzo di un determinato titolo su New York Stock Exchange. L'utente ha un'applicazione denominata Quote che a sua volta ha accesso ai dati di NY edizione Standard. La conversazione DDE tra Excel e Offerta avviene nel modo seguente:

  • L'utente avvia la conversazione specificando il nome dell'applicazione (offerta) che fornirà i dati e l'argomento specifico di interesse (NY edizione Standard). La conversazione DDE risultante viene usata per richiedere quotazioni su azioni specifiche.
  • Excel trasmette i nomi dell'applicazione e degli argomenti a tutte le applicazioni DDE attualmente in esecuzione nel sistema. La citazione risponde, stabilendo una conversazione con Excel sull'argomento NY edizione Standard.
  • L'utente può quindi creare una formula del foglio di calcolo in una cella che richiede l'aggiornamento automatico del foglio di calcolo ogni volta che viene modificata una determinata offerta azionaria. Ad esempio, l'utente potrebbe richiedere un aggiornamento automatico ogni volta che si verifica una modifica nel prezzo di vendita delle azioni ZAXX specificando la formula di Excel seguente: ='Quote'|' NY edizione Standard'! ZAXX
  • L'utente può terminare l'aggiornamento automatico dell'offerta azionaria ZAXX in qualsiasi momento. Altri collegamenti dati che sono stati stabiliti separatamente (ad esempio per le quotazioni per altri titoli) rimarranno attivi nella stessa conversazione di NY edizione Standard.
  • L'utente può anche terminare l'intera conversazione tra Excel e Virgolette sull'argomento NY edizione Standard, in modo che non sia possibile stabilire collegamenti dati specifici su tale argomento senza avviare una nuova conversazione.

Concetti relativi a Dynamic Data Exchange

Le sezioni seguenti illustrano i concetti e la terminologia importanti chiave per comprendere lo scambio di dati dinamici.

Client, server e conversazione

Due applicazioni che partecipano a DDE vengono dette coinvolte in una conversazione DDE. L'applicazione che avvia la conversazione è l'applicazione client DDE; l'applicazione che risponde al client è l'applicazione server DDE. Un'applicazione può interagire contemporaneamente in diverse conversazioni, fungendo da client in alcuni e come server in altri.

Una conversazione DDE viene eseguita tra due finestre, una per ognuna delle applicazioni partecipanti. Una finestra può essere la finestra principale dell'applicazione; una finestra associata a un documento specifico, come in un'applicazione MDI (Multiple-Document Interface); o una finestra nascosta (invisibile) il cui unico scopo è elaborare i messaggi DDE.

Poiché una conversazione DDE viene identificata dalla coppia di handle per le finestre coinvolte nella conversazione, non deve essere coinvolta alcuna finestra in più conversazioni con un'altra finestra. L'applicazione client o l'applicazione server devono fornire una finestra diversa per ognuna delle conversazioni con un server o un'applicazione client specifica.

Un'applicazione può garantire che una coppia di finestre client e server non sia mai coinvolta in più conversazioni creando una finestra nascosta per ogni conversazione. L'unico scopo di questa finestra è elaborare i messaggi DDE.

Nomi di applicazioni, argomenti e elementi

Il protocollo DDE identifica le unità di dati passate tra il client e il server con una gerarchia a tre livelli di nomi di applicazioni, argomenti e elementi.

Ogni conversazione DDE è definita in modo univoco dal nome e dall'argomento dell'applicazione. All'inizio di una conversazione DDE, il client e il server determinano il nome e l'argomento dell'applicazione. Il nome dell'applicazione è in genere il nome dell'applicazione server. Ad esempio, quando Excel funge da server in una conversazione, il nome dell'applicazione è Excel.

L'argomento DDE è una classificazione generale dei dati in cui più elementi di dati possono essere "discussi" (scambiati) durante la conversazione. Per le applicazioni che operano su documenti basati su file, l'argomento è in genere un nome file. Per altre applicazioni, l'argomento è un nome specifico dell'applicazione.

Poiché la finestra client e server gestisce insieme un'identificazione di una conversazione DDE, il nome e l'argomento dell'applicazione che definiscono una conversazione non possono essere modificati durante il corso della conversazione.

Un elemento di dati DDE è costituito da informazioni correlate all'argomento della conversazione scambiata tra le applicazioni. I valori per l'elemento di dati possono essere passati dal server al client o dal client al server. I dati possono essere passati con uno qualsiasi dei formati standard degli Appunti o con un formato registrato negli Appunti. Un formato speciale registrato denominato Link identifica un elemento in una conversazione DDE. Per altre informazioni sui formati degli Appunti, vedere Appunti.

Argomento di sistema

Le applicazioni devono supportare sempre l'argomento di sistema. In questo argomento viene fornito un contesto per informazioni che potrebbero essere di interesse generale per un'altra applicazione.

È necessario eseguire il rendering dei valori degli elementi di dati nel formato degli Appunti CF_TEXT . I singoli elementi dei valori degli elementi per un argomento di sistema devono essere delimitati da caratteri di tabulazioni. La tabella seguente suggerisce alcuni elementi per l'argomento di sistema.

Articolo Descrizione
Formati Elenco delimitato da tabulazioni dei formati che l'applicazione può eseguire il rendering. In genere, CF_ formati sono elencati con la parte "CF_" dei nomi rimossi (ad esempio, CF_TEXT è elencato come "TEXT").
Icona ? Testo che spiega brevemente come usare il server DDE.
Returnmessage Dettagli di supporto per il messaggio di WM_DDE_ACK usato più di recente. Questo elemento è utile quando sono necessari più di otto bit di dati restituiti specifici dell'applicazione.
Status Indicazione dello stato corrente dell'applicazione. Quando un server riceve un messaggio di WM_DDE_REQUEST per questo elemento dell'argomento di sistema, deve rispondere pubblicando un messaggio WM_DDE_DATA con una stringa contenente Occupato o Pronto, in base alle esigenze.
SysItems Elenco di elementi dell'argomento di sistema supportati dall'applicazione.
TopicItemList Analogamente all'elemento SysItems, ad eccezione del fatto che TopicItemList deve essere supportato per ogni argomento diverso dall'argomento di sistema. In questo modo è possibile esplorare gli elementi supportati in qualsiasi argomento. Se gli elementi non possono essere enumerati, questo elemento deve contenere solo "TopicItemList".
Argomenti Elenco di argomenti supportati dall'applicazione al momento corrente; questo elenco può variare da un momento all'altro.

 

Una volta avviata una conversazione DDE, il client può stabilire uno o più collegamenti dati permanenti con il server. Un collegamento dati è un meccanismo di comunicazione tramite il quale il server invia una notifica al client ogni volta che cambia il valore di un elemento di dati specificato. Il collegamento dati è permanente nel senso che questo processo di notifica continua fino a quando il collegamento dati o la conversazione DDE stessa non viene terminata.

Esistono due tipi di collegamenti dati DDE permanenti: accesso frequente e frequente. In un collegamento dati ad accesso frequente il server notifica al client che il valore dell'elemento dati è stato modificato, ma il server non invia il valore dei dati al client finché il client non lo richiede. In un collegamento a dati ad accesso frequente il server invia immediatamente il valore dei dati modificati al client.

Le applicazioni che supportano collegamenti dati ad accesso frequente o ad accesso frequente in genere forniscono un comando Copia o Incolla collegamento nel menu Modifica per consentire all'utente di stabilire collegamenti tra le applicazioni.

Atom e oggetti di memoria condivisa

Alcuni argomenti dei messaggi DDE sono atomi globali o oggetti di memoria condivisa. Le applicazioni che usano questi argomenti devono seguire regole esplicite su quando allocarle ed eliminarle. In tutti i casi, il mittente del messaggio deve eliminare qualsiasi oggetto atom o memoria condivisa che il ricevitore previsto non riceverà a causa di una condizione di errore, ad esempio un errore della funzione PostMessage .

DDE usa oggetti memoria condivisa per tre scopi:

Un'applicazione che riceve un oggetto memoria condivisa DDE deve considerarla di sola lettura. L'applicazione non deve utilizzare l'oggetto come area di lettura/scrittura reciproca per lo scambio gratuito di dati.

Come avviee con un atomO DDE, un'applicazione deve liberare un oggetto memoria condivisa per gestire in modo efficace la memoria. L'applicazione deve anche bloccare e sbloccare oggetti memoria.

Panoramica dei messaggi di Scambio di dati dinamici

Poiché DDE è un protocollo basato su messaggi, non usa funzioni o librerie. Tutte le transazioni DDE vengono eseguite passando determinati messaggi DDE definiti tra le finestre client e server.

Ci sono nove messaggi DDE; Le costanti simboliche per questi messaggi vengono definite nel file di intestazione DDE. Alcune strutture per i vari messaggi DDE sono definite anche in questo file di intestazione.

La tabella seguente riepiloga i messaggi DDE.

Message Descrizione
WM_DDE_ACK Conferma la ricezione o la mancata ricezione di un messaggio.
WM_DDE_ADVIedizione Standard Richiede all'applicazione server di fornire un aggiornamento o una notifica per un elemento di dati ogni volta che viene modificato. In questo modo viene stabilito un collegamento dati permanente.
WM_DDE_DATA Invia un valore dell'elemento dati all'applicazione client.
WM_DDE_EXECUTE Invia una stringa all'applicazione server, che dovrebbe elaborare la stringa come una serie di comandi.
WM_DDE_INITIATE Avvia una conversazione tra le applicazioni client e server.
WM_DDE_POKE Invia un valore dell'elemento dati all'applicazione server.
WM_DDE_REQUEST Richiede all'applicazione server di specificare il valore di un elemento di dati.
WM_DDE_TERMINATE Termina una conversazione.
WM_DDE_UNADVIedizione Standard Termina un collegamento dati permanente.

 

Un'applicazione chiama SendMessage per emettere il messaggio di WM_DDE_INITIATE o un messaggio di WM_DDE_ACK inviato in risposta a WM_DDE_INITIATE. Tutti gli altri messaggi vengono inviati da PostMessage. Il primo parametro di queste chiamate è un handle per la finestra di ricezione; il secondo parametro contiene il messaggio da inviare; il terzo parametro identifica la finestra di invio; e il quarto parametro contiene gli argomenti specifici del messaggio.

Flusso di messaggi di Dynamic Data Exchange

Una tipica conversazione DDE è costituita dagli eventi seguenti:

  1. L'applicazione client avvia la conversazione e l'applicazione server risponde.

  2. Le applicazioni scambiano dati con uno o tutti i metodi seguenti:

      • L'applicazione server invia i dati al client alla richiesta del client.
      • L'applicazione client invia dati non richiesti all'applicazione server.
      • L'applicazione client richiede all'applicazione server di notificare al client ogni volta che un elemento di dati viene modificato (collegamento dati ad accesso frequente).
      • L'applicazione client richiede all'applicazione server di inviare dati ogni volta che i dati vengono modificati (collegamento a dati ad accesso frequente).
      • L'applicazione server esegue un comando alla richiesta del client.
  3. L'applicazione client o server termina la conversazione.

Una finestra dell'applicazione che elabora le richieste da un client o da un server deve elaborarle rigorosamente nell'ordine in cui vengono ricevute.

Un client può stabilire conversazioni con più server; un server può avere conversazioni con più client. Quando si gestiscono i messaggi provenienti da più di un'origine, un client o un server deve elaborare i messaggi di una conversazione in modo sincrono, ma non è necessario elaborare tutti i messaggi in modo sincrono. In altre parole, può passare da una conversazione a un'altra in base alle esigenze.

Se un'applicazione non è in grado di elaborare una richiesta in ingresso perché è in attesa di una risposta DDE, deve impedire il deadlock pubblicando un messaggio WM_DDE_ACK con il membro fBusy della struttura DDEACK impostato su 1. Un'applicazione può anche inviare un messaggio di WM_DDE_ACK occupato se, per qualsiasi motivo, non può elaborare una richiesta in ingresso entro un periodo di tempo ragionevole.

Un'applicazione deve essere in grado di gestire l'errore di un client o di un server per rispondere a un messaggio entro un determinato periodo di tempo. Poiché l'intervallo di timeout può variare a seconda della natura dell'applicazione e della configurazione del sistema dell'utente (incluso se è connesso a una rete), l'applicazione deve fornire un modo per consentire all'utente di specificare l'intervallo.

Funzioni di compressione dei parametri

Il parametro lParam di molti messaggi DDE contiene due parti di dati. Ad esempio, lParam del messaggio WM_DDE_DATA contiene un handle dati e un atom. Le applicazioni devono usare la funzione PackDDElParam per comprimere l'handle e l'atom in un parametro lParam e la funzione UnpackDDElParam per rimuovere i valori. Le applicazioni DDE devono usare PackDDElParam e UnpackDDElParam per tutti i messaggi inviati durante una conversazione DDE.

Le applicazioni possono anche usare le funzioni ReuseDDElParam e FreeDDElParam. ReuseDDElParam consente a un'applicazione DDE di riutilizzare un parametro lParam compresso, riducendo il numero di riallocazioni di memoria che l'applicazione deve eseguire durante una conversazione. Un'applicazione può usare FreeDDElParam per liberare la memoria associata a un handle di dati ricevuto durante una conversazione DDE.

Scambio di dati dinamici e rappresentazione

Per consentire a un server di rappresentare un client, il client chiama la funzione DdeSetQualityOfService. La struttura edizione StandardCURITY_IMPERSONATION_LEVEL viene utilizzata per controllare il livello di rappresentazione che il server può eseguire.

Un server DDE può rappresentare un client DDE chiamando la funzione ImpersonateDdeClientWindow. Un server DDEML deve usare la funzione DdeImpersonateClient.