![]() |
Eigene Nachricht mit Parameterübergabe
Hallo,
ich hatte ja in einem anderen Thread schon mal über Messages geschrieben. Das Senden klappt auch eigentlich ganz gut. Jetzt wollte ich nurmal wissen, ob man an eigene Messages auch einen selbstdefinierten Parameter übergeben kann. Ich müsste nämlich wissen, von wo die Message kommt, bzw wie die Datei heißt, die mir die Message gesendet hat! Danke! |
Re: Eigene Nachricht mit Parameterübergabe
sowas würde ich immer mit WM_COPYDATA machen. Die WinAPI öffnet damit einen Speicherbereich des Senders für den Empfänger, aus dem dann gelesen werden kann.
Das geht afaik nicht mit anderen, selbst definierten Messages. EDIT: Wenn du die Messages in deinem eigenen Prozess verschickst, gehts natürlich so, wies Nuclear-Ping unten beschreibt. |
Re: Eigene Nachricht mit Parameterübergabe
Du musst einen eigenen Record definieren, daraus einen Pointer machen, Speicher reservieren und als LParam die Adresse des Pointers übergeben.
Hier mal ein Beispiel aus einem aktuellen Projekt:
Delphi-Quellcode:
Nicht vergessen, den Speicher dann in der Empfangsroutine wieder freizugeben. ;)
type
TOscDrawInfo = record Buffer: PChar; Size: Integer; OscRight, OscLeft: TBitmap; LW, LH, RW, RH: Integer; ScannerOsc: Boolean end; POscDrawInfo = ^TOscDrawInfo; {...} procedure DrawOscilloscope (Buffer: PChar; Size: Integer; OscRight, OscLeft: TBitmap; LW, LH, RW, RH: Integer; ScannerOsc: Boolean); var OscDrawInfo: POscDrawInfo; begin New (OscDrawInfo); GetMem (OscDrawInfo^.Buffer, Size); CopyMemory (OscDrawInfo^.Buffer, Buffer, Size); OscDrawInfo^.Size := Size; OscDrawInfo^.OscRight := OscRight; OscDrawInfo^.OscLeft := OscLeft; OscDrawInfo^.LW := LW; OscDrawInfo^.LH := LH; OscDrawInfo^.RW := RW; OscDrawInfo^.RH := RH; OscDrawInfo^.ScannerOsc := ScannerOsc; PostMessage (RadionicMainContainerForm.Handle, WM_USER, MSG_DRAW_OSCILLOSCOPE, Integer (OscDrawInfo)); end; |
Re: Eigene Nachricht mit Parameterübergabe
Zitat:
|
Re: Eigene Nachricht mit Parameterübergabe
Ja, sonst mit WM_COPYDATA. Dafür hab ich aber grad kein Beispiel. :P
|
Re: Eigene Nachricht mit Parameterübergabe
Danke an euch alle!
Das ist ja eigentlich ganz easy. Mit dem record-Pointer-Prinzip habe ich bereits Erfahrung... Dann werde ich mal ein bissl rumprobieren! Gute Nacht! |
Re: Eigene Nachricht mit Parameterübergabe
Guck mal hier:
![]() Innerhalb des eigenens Prozesses kannst du auch selbst definierte Nachrichten verschicken mit einem Zeiger auf einen Speicherbereich im lParam. |
Re: Eigene Nachricht mit Parameterübergabe
Das ist genau das, was ich gesucht habe! Nur ich hab mal eine Frage. Wo ist der Unterschied zwischen einem Record und einem packed Record.
|
Re: Eigene Nachricht mit Parameterübergabe
Zitat:
nur bei einem packed record kannst du dich drauf verlassen, dass die Daten dicht an dicht gepackt sind, z.B. bei
Delphi-Quellcode:
wird für byte1 der gleiche Speicherplatz reserviert wie für int1 und int2, damit die Daten im 32bit-Speicher ausgerichtet sind (bei 64bit wird an 64-bit-Grenzen ausgerichtet). Das gibt häufig Ärger, wenn du den Record mit anderen Programmen austauschst oder in eine Datenbank schreiben willst. Bei "packed" nimmt das byte auch nur ein byte ein.
test = record
int1 : integer; byte1 : byte; int2 : integer; end; Im Zweifel kannst/musst du das mit SizeOf prüfen: test ist 12 byte gross, als packed 9 byte. Gruss Reinhard |
Re: Eigene Nachricht mit Parameterübergabe
Also kann man sagen, dass nur noch packed-records verwendet werden sollten?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:16 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