Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Daten zwischen 2 Prozessen austauschen?? Wie? (https://www.delphipraxis.net/788-daten-zwischen-2-prozessen-austauschen-wie.html)

Christian Seehase 30. Sep 2002 10:06

Moin Luckie,

das ist zwar soweit richtig, allerdings ist die Chance dass so etwas passiert bei Verwendung eines GUID Strings wohl nahezu ausgeschlossen.
Ansonsten würde auch das ganze Prinzip von MSI oder COM nicht so richtig sauber funktionieren können.

Luckie 30. Sep 2002 11:19

Schon klar, ich meine ja nur.

Andererseits, wenn man beide Anwendungen selber programmiert, sollte man eigentlich in der Lage sein seine Fenster zufinden via Klasse oder Titel. Warum also andere Fenster mit der Nachricht belästigen?

"Programmierer gegen Windows-Message Spam :!:"

thomasdrewermann 30. Sep 2002 17:42

Wo setzte ich den in dem Code-Beispiel die GUID ein?

Christian Seehase 30. Sep 2002 17:46

Moin Thomas,

das würde ich so machen:

Code:
[b]var[/b]
  Form1: TForm1;
  dwMessage : DWORD;

[b]implementation[/b]

[color=#000080]{$R *.DFM}[/color]

[b]initialization[/b]
[b]begin[/b]
  dwMessage := RegisterWindowMessage('BB3D446B-80C1-4A0E-843F-1376A2CEF1D6');
[b]end[/b];
Die GUID ist natürlich nur ein Beispiel. Sie muss aber zwingend in jedem der beteiligten Programme exakt die gleiche sein.

thomasdrewermann 30. Sep 2002 17:49

Wie bau ich das bezogen auf diesen Code ein?
Sender:

Code:
Code:
procedure TForm1.FormCreate(Sender: TObject);
var
  aCopyData: TCopyDataStruct;
  p: PChar;
begin
  p := 'Hallo!';

  with aCopyData do begin
    dwData := 0;
    cbData := StrLen(p) + 1;
    lpData := p;
  end;

  SendMessage(FindWindow('TFormRecv', nil), WM_COPYDATA, Longint(Handle),
              Longint(@aCopyData));

  Application.Terminate;
end;

Receiver:
Code:
Code:
type
  TFormRecv = class(TForm)
  private
    procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
  end;

// ...

procedure TFormRecv.WMCopyData(var Msg: TWMCopyData);
begin
  ShowMessage(String(Msg.CopyDataStruct.lpData));
end;

Christian Seehase 30. Sep 2002 18:53

Liste der Anhänge anzeigen (Anzahl: 1)
Moin Thomas,

da in Deinem Beispiel mit WM_COPYDATA als Message gearbeitet wird: Gar nicht. ;-)

Ich hab' da mal eine Demo angehängt für RegisterWindowMessage.

Beim Button "Einfach" wird, mittels der selbst registrierten Message, und HWND_BROADCAST an alle Fenster die Message geschickt. Alle laufenden Instanzen des Programmes erhalten den Index der aktuell angewählten Zeile weitergeleitet, so dass im Edit Feld der Inhalt der Zeile steht.

Beim Button "Gezielt" wird, mit Hilfe des Fenstertitels, gezielt nach allen laufenden Instanzen des Programmes gesucht, und diesen gezielt die eigene Message geschickt. Hierbei wird dann der Pointer auf einen String als Parameter mitgegeben, und dieser String dann im Edit Feld angezeigt.

Man könnte das Ganze noch so ergänzen, dass die sendende Instanz eine Message an sich selber verwirft, und/oder das kein String, sondern ein Pointer auf eine beliebige andere (eigene) Struktur übergeben wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:00 Uhr.
Seite 4 von 4   « Erste     234   

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