Informatie verzenden (tekenreeks, afbeelding, record) tussen twee toepassingen

Er zijn veel situaties waarin u twee applicaties moet laten communiceren. Als u niet wilt knoeien met TCP- en socketcommunicatie (omdat beide toepassingen op dezelfde machine worden uitgevoerd), kunt u * eenvoudig * een speciaal Windows-bericht verzenden (en correct ontvangen): WM_COPYDATA.

Omdat het verwerken van Windows-berichten in Delphi eenvoudig is, is het vrij eenvoudig om een ​​SendMessage API-aanroep uit te voeren samen met de WM_CopyData gevuld met de te verzenden gegevens..

WM_CopyData en TCopyDataStruct

Met het bericht WM_COPYDATA kunt u gegevens van de ene toepassing naar de andere verzenden. De ontvangende toepassing ontvangt de gegevens in een TCopyDataStruct-record. De TCopyDataStruct wordt gedefinieerd in de Windows.pas-eenheid en verpakt de COPYDATASTRUCT-structuur die de door te geven gegevens bevat.

Hier is de verklaring en de beschrijving van het TCopyDataStruct-record:

 type TCopyDataStruct = ingepakt record dwData: DWORD; // tot 32 bits gegevens die moeten worden doorgegeven aan de ontvangende toepassing cbData: DWORD; // de grootte, in bytes, van de gegevens waarnaar het lpData-lid verwijst lpData: Pointer; // Wijst op gegevens die moeten worden doorgegeven aan de ontvangende toepassing. Dit lid kan nul zijn. einde; 

Stuur een string over WM_CopyData

Voor een toepassing "Afzender" om gegevens naar "Ontvanger" te verzenden, moet de CopyDataStruct worden ingevuld en doorgegeven met behulp van de functie SendMessage. U kunt als volgt een tekenreekswaarde verzenden via WM_CopyData:

 procedure TSenderMainForm.SendString (); var stringToSend: string; copyDataStruct: TCopyDataStruct; beginnen stringToSend: = 'Over Delphi-programmering'; copyDataStruct.dwData: = 0; // gebruik het om de inhoud van het bericht te identificeren copyDataStruct.cbData: = 1 + Lengte (stringToSend); copyDataStruct.lpData: = PChar (stringToSend); SendData (copyDataStruct); einde; 

De aangepaste functie SendData lokaliseert de ontvanger met behulp van de FindWindow API-aanroep:

 procedure TSenderMainForm.SendData (const copyDataStruct: TCopyDataStruct); var   receiverHandle: THandle; res: geheel getal; beginnen   receiverHandle: = FindWindow (PChar ('TReceiverMainForm'), PChar ('ReceiverMainForm'));   als receiverHandle = 0 vervolgens   beginnen     ShowMessage ('CopyData Receiver NIET gevonden!'); Uitgang;   einde; res: = SendMessage (receiverHandle, WM_COPYDATA, Integer (Handle), Integer (@copyDataStruct)); einde; 

In de bovenstaande code is de toepassing "Receiver" gevonden met behulp van de FindWindow API-aanroep door de klassenaam van het hoofdformulier ("TReceiverMainForm") en het bijschrift van het venster ("ReceiverMainForm") door te geven.

Opmerking: De SendMessage retourneert een geheel getal toegewezen door de code die het WM_CopyData-bericht heeft afgehandeld.

WM_CopyData afhandelen - Een string ontvangen

De toepassing "Ontvanger" behandelt het WM_CopyData-bericht zoals in:

 type TReceiverMainForm = class (TForm) privaat procedure WMCopyData (var Msg: TWMCopyData); bericht WM_COPYDATA; ... implementatie... procedure TReceiverMainForm.WMCopyData (var Msg: TWMCopyData); var s: string; beginnen s: = PChar (Msg.CopyDataStruct.lpData); // Stuur iets terug msg. resultaat: = 2006; einde; 

Het TWMCopyData-record wordt verklaard als:

 TWMCopyData = verpakt record Msg: Cardinal; Van: HWND;// Handvat van het venster dat de gegevens heeft doorgegeven CopyDataStruct: PCopyDataStruct; // gegevens doorgegeven Resultaat: Longint;// Gebruik het om een ​​waarde terug te sturen naar de "Afzender" einde;