Comment envoyer des informations (chaîne, image, enregistrement) entre deux applications

Il existe de nombreuses situations où vous devez autoriser la communication de deux applications. Si vous ne voulez pas gâcher la communication TCP et sockets (car les deux applications s'exécutent sur la même machine), vous pouvez * simplement * envoyer (et recevoir correctement) un message spécial Windows: WM_COPYDATA.

Étant donné que la gestion des messages Windows dans Delphi est simple, l'émission d'un appel API SendMessage avec le WM_CopyData rempli avec les données à envoyer est assez simple.

WM_CopyData et TCopyDataStruct

Le message WM_COPYDATA vous permet d'envoyer des données d'une application à une autre. L'application réceptrice reçoit les données dans un enregistrement TCopyDataStruct. Le TCopyDataStruct est défini dans l'unité Windows.pas et encapsule la structure COPYDATASTRUCT qui contient les données à transmettre.

Voici la déclaration et la description de l'enregistrement TCopyDataStruct:

 type TCopyDataStruct = record emballé dwData: DWORD; // jusqu'à 32 bits de données à transmettre à l'application réceptrice cbData: DWORD; // la taille, en octets, des données pointées par le membre lpData lpData: pointeur; // Pointe vers les données à transmettre à l'application réceptrice. Ce membre peut être nul. fin; 

Envoyer une chaîne sur WM_CopyData

Pour qu'une application "Sender" envoie des données à "Receiver", le CopyDataStruct doit être rempli et transmis à l'aide de la fonction SendMessage. Voici comment envoyer une valeur de chaîne sur WM_CopyData:

 procédure TSenderMainForm.SendString (); var stringToSend: string; copyDataStruct: TCopyDataStruct; commencer stringToSend: = 'À propos de la programmation Delphi'; copyDataStruct.dwData: = 0; // l'utiliser pour identifier le contenu du message copyDataStruct.cbData: = 1 + Longueur (stringToSend); copyDataStruct.lpData: = PChar (stringToSend); SendData (copyDataStruct); fin; 

La fonction personnalisée SendData localise le récepteur à l'aide de l'appel API FindWindow:

 procédure TSenderMainForm.SendData (const copyDataStruct: TCopyDataStruct); var   receiverHandle: THandle; res: entier; commencer   receiverHandle: = FindWindow (PChar ('TReceiverMainForm'), PChar ('ReceiverMainForm'));   si receiverHandle = 0 ensuite   commencer     ShowMessage ('CopyData Receiver NOT found!'); Sortie;   fin; res: = SendMessage (receiverHandle, WM_COPYDATA, Integer (Handle), Integer (@copyDataStruct)); fin; 

Dans le code ci-dessus, l'application "Receiver" a été trouvée en utilisant l'appel API FindWindow en passant le nom de classe du formulaire principal ("TReceiverMainForm") et la légende de la fenêtre ("ReceiverMainForm").

Remarque: SendMessage renvoie une valeur entière affectée par le code qui a géré le message WM_CopyData.

Gestion de WM_CopyData - Réception d'une chaîne

L'application "Receiver" gère le message WM_CopyData comme dans:

 type TReceiverMainForm = classe (TForm) privé procédure WMCopyData (var Msg: TWMCopyData); message WM_COPYDATA;… la mise en oeuvreprocédure TReceiverMainForm.WMCopyData (var Msg: TWMCopyData); var s: chaîne; commencer s: = PChar (Msg.CopyDataStruct.lpData); // Renvoie quelque chose msg.Résultat: = 2006; fin; 

L'enregistrement TWMCopyData est déclaré comme:

 TWMCopyData = enregistrement compressé Msg: Cardinal; De: HWND;// Poignée de la fenêtre qui a transmis les données CopyDataStruct: PCopyDataStruct; // données transmises Résultat: Longint;// Utilisez-le pour renvoyer une valeur à "l'expéditeur" fin;