Cum să trimiteți informații (șir, imagine, înregistrare) între două aplicații

Există multe situații când trebuie să permiteți comunicarea a două aplicații. Dacă nu doriți să încurcați cu TCP și comunicarea prin sockets (deoarece ambele aplicații rulează pe aceeași mașină), puteți * pur și simplu * trimite (și primi în mod corespunzător) un mesaj special pentru Windows: WM_COPYDATA.

Întrucât gestionarea mesajelor Windows în Delphi este simplă, emiterea unui apel API SendMessage împreună cu WM_CopyData completat cu datele care trebuie trimise este destul de directă.

WM_CopyData și TCopyDataStruct

Mesajul WM_COPYDATA vă permite să trimiteți date de la o aplicație la alta. Aplicația primitoare primește datele într-o înregistrare TCopyDataStruct. TCopyDataStruct este definit în unitatea Windows.pas și înfășoară structura COPYDATASTRUCT care conține datele care trebuie transmise.

Iată declarația și descrierea înregistrării TCopyDataStruct:

 tip TCopyDataStruct = înregistrare la pachet dwData: DWORD; // până la 32 de biți de date care urmează să fie transmise aplicației receptoare cbData: DWORD; // dimensiunea, în octeți, a datelor indicate de membrul lpData lpData: Pointer; // Indică date care trebuie transmise cererii de primire. Acest membru poate fi nul. Sfârșit; 

Trimiteți o șiruri peste WM_CopyData

Pentru o aplicație „Expeditor” pentru a trimite date către „Receiver”, CopyDataStruct trebuie completat și transmis folosind funcția SendMessage. Iată cum puteți trimite o valoare de șir peste WM_CopyData:

 procedură TSenderMainForm.SendString (); var stringToSend: string; copyDataStruct: TCopyDataStruct; începe stringToSend: = 'Despre programarea Delphi'; copyDataStruct.dwData: = 0; // folosiți-l pentru a identifica conținutul mesajului copyDataStruct.cbData: = 1 + Lungime (stringToSend); copyDataStruct.lpData: = PChar (stringToSend); SendData (copyDataStruct); Sfârșit; 

Funcția personalizată SendData localizează receptorul folosind apelul API FindWindow:

 procedură TSenderMainForm.SendData (const copyDataStruct: TCopyDataStruct); var   receptorHandle: Thandle; res: număr întreg; începe   receiverHandle: = FindWindow (PChar ('TReceiverMainForm'), PChar ('ReceiverMainForm'));   dacă receptorHandle = 0 apoi   începe     ShowMessage („CopyData Receiver NOT found”); Ieșire;   Sfârșit; res: = SendMessage (receiverHandle, WM_COPYDATA, Integer (Handle), Integer (@copyDataStruct)); Sfârșit; 

În codul de mai sus, aplicația „Receiver” a fost găsită folosind apelul API FindWindow trecând numele clasei formularului principal („TReceiverMainForm”) și subtitrarea ferestrei („ReceiverMainForm”).

Notă: SendMessage returnează o valoare întreagă atribuită de codul care a gestionat mesajul WM_CopyData.

Manipularea WM_CopyData - Primirea unei șiruri

Aplicația „Receiver” gestionează mesajul WM_CopyData ca în:

 tip TReceiverMainForm = clasă (TForm) privat procedură WMCopyData (var Msg: TWMCopyData); mesaj WM_COPYDATA; ... punerea în aplicare... procedură TReceiverMainForm.WMCopyData (var Msg: TWMCopyData); var s: șir; începe s: = PChar (Msg.CopyDataStruct.lpData); // Trimite ceva înapoi msg.Result: = 2006; Sfârșit; 

Înregistrarea TWMCopyData este declarată ca:

 TWMCopyData = înregistrare la pachet Msg: Cardinal; De la: HWND;// Mânerul ferestrei care a trecut datele CopyDataStruct: PCopyDataStruct; // date transmise Rezultat: Longint;// Folosiți-o pentru a trimite o valoare înapoi la „Expeditor” Sfârșit;