Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Kommunikation zwischen einem Delphi-Prog und einem C++ Prog (https://www.delphipraxis.net/59962-kommunikation-zwischen-einem-delphi-prog-und-einem-c-prog.html)

Geri 31. Dez 2005 15:31


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

SirThornberry 31. Dez 2005 15:41

Re: Kommunikation zwischen einem Delphi-Prog und einem C++ P
 
du könntest mit wm_copydata arbeiten

Geri 31. Dez 2005 15:48

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

jim_raynor 31. Dez 2005 16:03

Re: Kommunikation zwischen einem Delphi-Prog und einem C++ P
 
Und heute gibt es immer noch DDE ;)

Bernhard Geyer 31. Dez 2005 16:07

Re: Kommunikation zwischen einem Delphi-Prog und einem C++ P
 
Zitat:

Zitat von Geri
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?

Wie denn? Es ist nur die ID der Windows-Message festgelegt aber sonst nichts.
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.

Geri 31. Dez 2005 16:32

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:
/ 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;
Daraus habe ich zwei Programme erstellt und siehe da, es funktioniert super!!!! In C dürfte es gleich gehen.

'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

tommie-lie 31. Dez 2005 17:58

Re: Kommunikation zwischen einem Delphi-Prog und einem C++ P
 
Zitat:

Zitat von Geri
Ach ja, kann der receiver auch daten direkt zurückschicken und der Sender auf diese Nachricht warten, gleich nachem er gesendet hat?

Send-Message ist bereits synchron und liefert einen Integer als Wert zurück. Diesen Integer-Wert kannst du vom Recevier aus verändern, indem du der Message ein Ergebnis zuweist (TMessage/TMsg haben dafür eigene Member, wenn ich mich recht erinnere). Benötigst du mehr Daten als 4 Byte, kannst du beispielsweise Mutexe oder Semaphores benutzen, die der Receiver erzeugt und auf die der Sender nach der Rückkehr von SendMessage() wartet.
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 00:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz