So senden Sie Informationen (Zeichenfolge, Bild, Datensatz) zwischen zwei Anwendungen

Es gibt viele Situationen, in denen zwei Anwendungen miteinander kommunizieren müssen. Wenn Sie nicht mit der TCP- und Sockets-Kommunikation in Konflikt geraten möchten (da beide Anwendungen auf demselben Computer ausgeführt werden), können Sie eine spezielle Windows-Nachricht * einfach * senden (und ordnungsgemäß empfangen): WM_COPYDATA.

Da die Behandlung von Windows-Nachrichten in Delphi einfach ist, ist es ganz einfach, einen SendMessage-API-Aufruf zusammen mit den WM_CopyData-Daten abzusetzen, die mit den zu sendenden Daten gefüllt sind.

WM_CopyData und TCopyDataStruct

Mit der WM_COPYDATA-Nachricht können Sie Daten von einer Anwendung an eine andere senden. Die empfangende Anwendung empfängt die Daten in einem TCopyDataStruct-Datensatz. Die TCopyDataStruct wird in der Unit Windows.pas definiert und umschließt die COPYDATASTRUCT-Struktur, die die zu übergebenden Daten enthält.

Hier ist die Deklaration und die Beschreibung des TCopyDataStruct-Datensatzes:

 Art TCopyDataStruct = gepackte Platte DwData: DWORD; // Bis zu 32 Datenbits, die an die empfangende Anwendung übergeben werden sollen cbData: DWORD; // Die Größe der Daten in Byte, auf die das lpData-Mitglied zeigt lpData: Pointer; // Zeigt auf Daten, die an die empfangende Anwendung übergeben werden sollen. Dieses Mitglied kann null sein. Ende; 

Senden Sie einen String über WM_CopyData

Damit eine "Sender" -Anwendung Daten an "Empfänger" senden kann, muss die CopyDataStruct mit der SendMessage-Funktion gefüllt und übergeben werden. So senden Sie einen Zeichenfolgenwert über WM_CopyData:

 Verfahren TSenderMainForm.SendString (); var stringToSend: string; copyDataStruct: TCopyDataStruct; Start stringToSend: = 'Über Delphi-Programmierung'; copyDataStruct.dwData: = 0; // benutze es, um den Inhalt der Nachricht zu identifizieren copyDataStruct.cbData: = 1 + Length (stringToSend); copyDataStruct.lpData: = PChar (stringToSend); SendData (copyDataStruct); Ende; 

Die benutzerdefinierte SendData-Funktion sucht den Empfänger mithilfe des FindWindow-API-Aufrufs:

 Verfahren TSenderMainForm.SendData (const copyDataStruct: TCopyDataStruct); var   receiverHandle: THandle; res: integer; Start   receiverHandle: = FindWindow (PChar ('TReceiverMainForm'), PChar ('ReceiverMainForm'));   wenn receiverHandle = 0 dann   Start     ShowMessage ('CopyData Receiver NICHT gefunden!'); Ausgang;   Ende; res: = SendMessage (receiverHandle, WM_COPYDATA, Integer (Handle), Integer (@copyDataStruct)); Ende; 

Im obigen Code wurde die Anwendung "Receiver" mithilfe des FindWindow-API-Aufrufs gefunden, indem der Klassenname des Hauptformulars ("TReceiverMainForm") und die Beschriftung des Fensters ("ReceiverMainForm") übergeben wurden..

Hinweis: SendMessage gibt einen ganzzahligen Wert zurück, der durch den Code zugewiesen wurde, der die WM_CopyData-Nachricht verarbeitet hat.

Umgang mit WM_CopyData - Empfangen eines Strings

Die Anwendung "Receiver" verarbeitet die Meldung WM_CopyData wie folgt:

 Art TReceiverMainForm = Klasse (TForm) Privat Verfahren WMCopyData (var Msg: TWMCopyData); Botschaft WM_COPYDATA;… ImplementierungVerfahren TReceiverMainForm.WMCopyData (var Msg: TWMCopyData); var s: string; Start s: = PChar (Msg.CopyDataStruct.lpData); // Sende etwas zurück msg.Result: = 2006; Ende; 

Der TWMCopyData-Datensatz wird wie folgt deklariert:

 TWMCopyData = gepackter Datensatz Msg: Cardinal; Von: HWND;// Handle des Fensters, das die Daten übergeben hat CopyDataStruct: PCopyDataStruct; // Daten übergeben Ergebnis: Longint;// Sende damit einen Wert zurück an den "Absender" Ende;