Come inviare informazioni (stringa, immagine, record) tra due applicazioni

Esistono molte situazioni in cui è necessario consentire la comunicazione tra due applicazioni. Se non si desidera interferire con la comunicazione TCP e socket (poiché entrambe le applicazioni sono in esecuzione sullo stesso computer), è possibile * semplicemente * inviare (e ricevere correttamente) un messaggio speciale di Windows: WM_COPYDATA.

Poiché la gestione dei messaggi di Windows in Delphi è semplice, l'emissione di una chiamata API SendMessage insieme a WM_CopyData riempita con i dati da inviare è piuttosto semplice.

WM_CopyData e TCopyDataStruct

Il messaggio WM_COPYDATA consente di inviare dati da un'applicazione a un'altra. L'applicazione ricevente riceve i dati in un record TCopyDataStruct. TCopyDataStruct è definito nell'unità Windows.pas e racchiude la struttura COPYDATASTRUCT che contiene i dati da trasmettere.

Ecco la dichiarazione e la descrizione del record TCopyDataStruct:

 genere TCopyDataStruct = record imballato dwData: DWORD; // fino a 32 bit di dati da trasmettere all'applicazione ricevente cbData: DWORD; // la dimensione, in byte, dei dati indicati dal membro lpData lpData: puntatore; // Indica i dati da trasmettere all'applicazione ricevente. Questo membro può essere nullo. fine; 

Invia una stringa su WM_CopyData

Affinché un'applicazione "Sender" invii i dati a "Receiver", CopyDataStruct deve essere compilato e passato utilizzando la funzione SendMessage. Ecco come inviare un valore di stringa su WM_CopyData:

 procedura TSenderMainForm.SendString (); var stringToSend: string; copyDataStruct: TCopyDataStruct; inizio stringToSend: = 'Informazioni sulla programmazione Delphi'; copyDataStruct.dwData: = 0; // usalo per identificare il contenuto del messaggio copyDataStruct.cbData: = 1 + Lunghezza (stringToSend); copyDataStruct.lpData: = PChar (stringToSend); SendData (copyDataStruct); fine; 

La funzione personalizzata SendData individua il destinatario utilizzando la chiamata API FindWindow:

 procedura TSenderMainForm.SendData (const copyDataStruct: TCopyDataStruct); var   receiverHandle: THandle; res: intero; inizio   receiverHandle: = FindWindow (PChar ('TReceiverMainForm'), PChar ('ReceiverMainForm'));   Se receiverHandle = 0 poi   inizio     ShowMessage ('Ricevitore CopyData NON trovato!'); Uscita;   fine; res: = SendMessage (receiverHandle, WM_COPYDATA, Integer (Handle), Integer (@copyDataStruct)); fine; 

Nel codice sopra, l'applicazione "Receiver" è stata trovata utilizzando la chiamata API FindWindow passando il nome della classe del modulo principale ("TReceiverMainForm") e la didascalia della finestra ("ReceiverMainForm").

Nota: SendMessage restituisce un valore intero assegnato dal codice che ha gestito il messaggio WM_CopyData.

Gestione di WM_CopyData - Ricezione di una stringa

L'applicazione "Ricevitore" gestisce il messaggio WM_CopyData come in:

 genere TReceiverMainForm = class (TForm) privato procedura WMCopyData (var Messaggio: TWMCopyData); Messaggio WM_COPYDATA; ... implementazione... procedura TReceiverMainForm.WMCopyData (var Msg: TWMCopyData); var s: stringa; inizio s: = PChar (Msg.CopyDataStruct.lpData); // Invia qualcosa indietro msg. risultato: = 2006; fine; 

Il record TWMCopyData è dichiarato come:

 TWMCopyData = record compresso Messaggio: Cardinale; Da: HWND;// Gestione della finestra che ha passato i dati CopyDataStruct: PCopyDataStruct; // dati passati Risultato: Longint;// Usalo per inviare un valore al "Mittente" fine;