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ă.
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;
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.
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;