![]() |
Kommunikation zwischen einem Delphi-Prog und einem C++ Prog
Hallo zusammen
Ich habe eine MS-Windows-Anwendung, die in Delphi geschrieben ist und eine Windows-Anwendung, die in C++ unter Visual Studio geschrieben ist. Die C++. Nun möchte ich, dass beide Programm Daten austauschen könne. Das Delphi-Programm sendet z.B. einen Puffer mit 100 Bytes und erhält vom C++-Programm Daten zurück. (Das Delphi-PRogramm sendet z.B. einen Befehl mit Paramter und erhält Informationen zurück. Der Datenaustausch sollte mit mindestens 1MBit erfolgen. Habt jemand von Euch vielleicht eine gute Idee, wie man so ein Problem lösen kann. Früher gab es ja DDE, das war sehr einfach. Vielen Dank für Eure Rückmeldung, ich wüsche Euch Allen einen guten Rutsch ins Neue Jahr, beste Grüsse Geri |
Re: Kommunikation zwischen einem Delphi-Prog und einem C++ P
du könntest mit wm_copydata arbeiten
|
Re: Kommunikation zwischen einem Delphi-Prog und einem C++ P
Hallo SirThornberry
Vielen Dank für Deine rasche Antwort auf mein Anliegen. Super Idee!!! Wenn man unter der MSN recherchiert findet man auch ein Beispiel in C++. Gibt es für Delphi hier vielleicht eine fertige Komponente bei der man den Namen der Anwendung angibt, den Puffer und die über eine Sende/Empfangsroutine verfügt? Freundliche Grüsse Geri |
Re: Kommunikation zwischen einem Delphi-Prog und einem C++ P
Und heute gibt es immer noch DDE ;)
|
Re: Kommunikation zwischen einem Delphi-Prog und einem C++ P
Zitat:
Also "einfach" WM_COPYDATA als Message-Eventhandler in deinem Hauptformular definieren und Daten entsprechend deiner Schnittstellenabsprache mit dem C++-Entwickler codieren/dekodieren. Bessere Schnittstellenbeschreibungen gibt es nur wenn Du z.B. COM oder SOAP verwenden würdest. Bei COM kannst Du dann einfach die Typbibliothek des C++-Programms importieren und hast dann alle in der Schnittstelle definierten Methoden mit Aufrufparametern als Pascal-Importdatei. |
Re: Kommunikation zwischen einem Delphi-Prog und einem C++ P
Hallo und vielen Dank für Eure Antworten
Mit dem Hinweis von Sirthornberry fand ich bei meiner Suche folgenden Code:
Delphi-Quellcode:
Daraus habe ich zwei Programme erstellt und siehe da, es funktioniert super!!!! In C dürfte es gleich gehen.
/ Sender: Send data
// Sender: Daten schicken procedure TForm1.Button1Click(Sender: TObject); var aCopyData: TCopyDataStruct; hTargetWnd: HWND; begin with aCopyData do begin dwData := 0; cbData := StrLen(PChar(Edit1.Text)) + 1; lpData := PChar(Edit1.Text) end; // Search window by the window title // Fenster anhand des Titelzeilentext suchen hTargetWnd := FindWindowEx(0, 0, nil, PChar('WM_COPYDATA-Receiver')); if hTargetWnd <> 0 then SendMessage(hTargetWnd, WM_COPYDATA, Longint(Handle), Longint(@aCopyData)) else ShowMessage('No Recipient found!'); end; (* -------------------------------------------------------------------- *) // Recipient - Receive data // Empfänger - Daten empfangen type TForm1 = class(TForm) private { Private declarations } procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA; public { Public declarations } end; procedure TForm1.WMCopyData(var Msg: TWMCopyData); var sText: array[0..99] of Char; begin // generate text from parameter // anzuzeigenden Text aus den Parametern generieren StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData); // write received text // Empfangenen Text ausgeben label1.Caption := sText; end; 'WM_COPYDATA-Receiver' entspricht dem Titel des Fensters der Empfängeranwendung => In der Receiveranwendung also (Form1.caption:='WM_COPYDATA-Receiver'; setzen. Obwohl dieser Code sehr einfach ist, könnte man auf Delphi-Seite trotzdem eine (kleine)Komponente mit Sende und Empfangsroutinen bauen.) Ach ja, kann der receiver auch daten direkt zurückschicken und der Sender auf diese Nachricht warten, gleich nachem er gesendet hat? procedure TForm1.Button1Click(Sender: TObject); var aCopyData: TCopyDataStruct; hTargetWnd: HWND; begin with aCopyData do begin dwData := 0; cbData := StrLen(PChar(Edit1.Text)) + 1; lpData := PChar(Edit1.Text) end; // Search window by the window title // Fenster anhand des Titelzeilentext suchen hTargetWnd := FindWindowEx(0, 0, nil, PChar('WM_COPYDATA-Receiver')); if hTargetWnd <> 0 then begin SendMessage(hTargetWnd, WM_COPYDATA, Longint(Handle), Longint(@aCopyData)) lies rückgabewerte des Receivers end else ShowMessage('No Recipient found!'); end; Vielen Dank !!! und beste Grüsse Geri |
Re: Kommunikation zwischen einem Delphi-Prog und einem C++ P
Zitat:
Eine andere Möglichkeit wäre, die Nachrichtenschleife zu überschreiben und alle Nachrichten in eine lokale Queue zu stopfen, bis du die eine gewünschte Nachricht erhältst. Ist diese Nachricht bearbeitet, wird zunächst die lokale Queue mit den alten Nachrichten abgearbeitet und anschließend die globale weiterbearbeitet. Das könnte aber je nach Message auch Nebenwirkungen mit sich ziehen und ist mit Sicherheit komplexer als ein Mutex. Eine Möglichkeit, gezielt eine Message aus der globalen Message-Queue zu fischen bzw auf deren Ankunft zu warten ist mir nicht bekannt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz