Autor Beitrag
LittleBen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 258
Erhaltene Danke: 4

Win 7, Mac OS
Delphi 7
BeitragVerfasst: Mi 15.02.12 22:32 
Hallo zusammen,
mit meinem Programm will ich ein Record zu einem anderen Programm schicken. Funktioniert eigentlich auch ganz gut:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
var RText: PText;
    cds: TCopyDataStruct;
    h: THandle;
begin
 GetMem(RText, sizeof(TText));
 try

  RText.Text:= 'Text';

  cds.dwData:= 0;
  cds.cbData:= sizeof(TText);
  cds.lpData:= RText;

  h:= FindWindow(nil'Receiver');
  if h<>0 then
  begin
   SendMessage(h, WM_COPYDATA, 0, Integer(@cds)); 
  end
  else;

 finally
  FreeMem(RText, sizeof(TText));
 end;

Nur will ich nicht, dass nach dem Senden auf eine Empfangsbestätigung gewartet wird. Und dafür ist ja das Postmessage geeignet. Habe aber gelesen, dass Postmessage mit WM_COPYDATA nicht funktioniert...
Was könnte machen, um das Record einfach nur weg zu feuern? (Fire and forget^^)

Viele Grüße,
Littleben
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 15.02.12 23:56 
Theoretisch könntest du vielleicht einen Speicherbereich reservieren und auf der anderen Seite freigeben. Aber wozu? Es gibt doch genug sinnvollere Wege...

Seien es MMFs, Named Pipes, ...
Je nach Anwendungszweck kannst du nehmen was am besten passt. Mit MMFs kannst du einen gemeinsamen Speicherbereich umsetzen, mit Names Pipes Daten auf einer Seite schicken und auf der anderen empfangen. Und je nachdem was du machen willst gibt es auch noch einige Möglichkeiten mehr.

Außerdem gibt es eigentlich keine große Verzögerung bei der Messagebehandlung, wenn du SendMessage benutzt. Du darfst natürlich auf Empfängerseite nicht die ganze Behandlung durchführen bevor du die Antwort schickst...
LittleBen Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 258
Erhaltene Danke: 4

Win 7, Mac OS
Delphi 7
BeitragVerfasst: Do 16.02.12 14:38 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Außerdem gibt es eigentlich keine große Verzögerung bei der Messagebehandlung, wenn du SendMessage benutzt. Du darfst natürlich auf Empfängerseite nicht die ganze Behandlung durchführen bevor du die Antwort schickst...
Das ist mein Problem. Denn dirket beim Empfangen des Records führe ich eine Prozedur aus, die ca. 2 Sekunden dauert. Theoretisch müsste ich vor dieser Prozedur erst die Antwort schicken...aber wie mach ich das?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 16.02.12 14:49 
Wie in der Doku steht:
Daten rauskopieren und die Botschaftsbehandlung verlassen. Danach die Daten dann bearbeiten. Zum Beispiel indem du dir selbst eine Message im Empfangsprogramm schickst.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 16.02.12 14:51 
Eine Möglichkeit wäre, im MessageHandler von "DoSomething", die vom fremden Prozess gesendet wurde, nur eine Message "ReallyDoSomething" an sich selbst abzusenden, wo dann die eigentliche Aufgabe erledigt wird.

_________________
We are, we were and will not be.
LittleBen Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 258
Erhaltene Danke: 4

Win 7, Mac OS
Delphi 7
BeitragVerfasst: Do 16.02.12 15:24 
Das ist eine gute Idee!! Aber die eigene Nachricht muss dann natürlich mit PostMessage abgeschickt werden, sonst kommt ja das gleiche raus.

Vieelen Dank! Funktioniert wunderbar :)

Grüße,
Littleben