Hur man skickar information (sträng, bild, post) mellan två applikationer

Det finns många situationer när du måste tillåta två applikationer att kommunicera. Om du inte vill röra med TCP och sockets-kommunikation (eftersom båda applikationerna körs på samma maskin) kan du * helt enkelt * skicka (och få korrekt) ett speciellt Windows-meddelande: WM_COPYDATA.

Eftersom hanteringen av Windows-meddelanden i Delphi är enkel är det ganska rakt fram att utföra ett SendMessage API-samtal tillsammans med WM_CopyData fylld med de data som ska skickas..

WM_CopyData och TCopyDataStruct

Med WM_COPYDATA-meddelandet kan du skicka data från en applikation till en annan. Den mottagande applikationen tar emot uppgifterna i en TCopyDataStruct-post. TCopyDataStruct definieras i Windows.pas-enheten och lindar COPYDATASTRUCT-strukturen som innehåller data som ska skickas.

Här är deklarationen och beskrivningen av TCopyDataStruct-posten:

 typ TCopyDataStruct = packad skiva dwData: DWORD; // upp till 32 bitar data som ska skickas till den mottagande ansökan cbData: DWORD; // storleken, i byte, på de uppgifter som lpData-medlemmen pekar på lpData: Pekare; // Pekar på data som ska skickas till den mottagande ansökan. Denna medlem kan vara noll. slutet; 

Skicka en sträng över WM_CopyData

För en "avsändare" -applikation för att skicka data till "mottagare" måste CopyDataStruct fyllas och skickas med funktionen SendMessage. Så här skickar du ett strängvärde över WM_CopyData:

 procedur TSenderMainForm.SendString (); var stringToSend: string; copyDataStruct: TCopyDataStruct; Börja stringToSend: = 'Om Delphi-programmering'; copyDataStruct.dwData: = 0; // använd den för att identifiera meddelandets innehåll copyDataStruct.cbData: = 1 + Längd (stringToSend); copyDataStruct.lpData: = PChar (stringToSend); SendData (copyDataStruct); slutet; 

Den anpassade SendData-funktionen lokaliserar mottagaren med FindWindow API-samtal:

 procedur TSenderMainForm.SendData (const copyDataStruct: TCopyDataStruct); var   receiverHandle: THandle; res: heltal; Börja   receiverHandle: = FindWindow (PChar ('TReceiverMainForm'), PChar ('ReceiverMainForm'));   om receiverHandle = 0 sedan   Börja     ShowMessage ('CopyData-mottagare hittades INTE!'); Utgång;   slutet; res: = SendMessage (receiverHandle, WM_COPYDATA, heltal (handtag), heltal (@copyDataStruct)); slutet; 

I koden ovan hittades applikationen "Mottagare" med FindWindow API-samtalet genom att lämna klassnamnet för huvudformuläret ("TReceiverMainForm") och bildtexten för fönstret ("ReceiverMainForm").

Obs: SendMessage returnerar ett heltalvärde som tilldelats av koden som hanterade WM_CopyData-meddelandet.

Hantering av WM_CopyData - ta emot en sträng

Applikationen "Mottagare" hanterar meddelandet WM_CopyData som i:

 typ TReceiverMainForm = klass (TForm) privat procedur WMCopyData (var Msg: TWMCopyData); meddelande WM_COPYDATA; ... genomförande... procedur TReceiverMainForm.WMCopyData (var Msg: TWMCopyData); var s: sträng; Börja s: = PChar (Msg.CopyDataStruct.lpData); // Skicka tillbaka något msg.Result: = 2006; slutet; 

TWMCopyData-posten deklareras som:

 TWMCopyData = packad post Msg: kardinal; Från: HWND;// Handle of the Window som skickade data CopyDataStruct: PCopyDataStruct; // data skickas Resultat: Longint;// Använd den för att skicka ett värde tillbaka till "Avsändaren" slutet;