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