Entwickler-Ecke
Windows API - Postmessage und WM_COPYDATA
LittleBen - Mi 15.02.12 22:32
Titel: Postmessage und WM_COPYDATA
Hallo zusammen,
mit meinem Programm will ich ein Record zu einem anderen Programm schicken. Funktioniert eigentlich auch ganz gut:
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 - 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 - Do 16.02.12 14:38
jaenicke hat folgendes geschrieben : |
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 - 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 - 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.
LittleBen - 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!