![]() |
Daten per Message übertragen (WM_COPYDATA?)
Hallo,
bin hier gerade munter am Proggen und weiß noch nicht mal, ob das so funktioniert, wie ich meine. Ich versende Nachrichten, die einen Pointer auf ein bei mir liegendes struct (record) enthalten. kann das programm, das den Pointer empfängt, auf die Daten an der adresse zugreifen? Bzw. passiert bei WM_COPYDATA irgendetwas spezielles? Ich habe jetzt selbst definierte Nachrichten im Stil von WM_USER + xxx. |
Re: Daten per Message übertragen (WM_COPYDATA?)
Ja, das andere Programm kann auf den Speicher zugreifen. :)
|
Re: Daten per Message übertragen (WM_COPYDATA?)
WM_COPYDATA sorgt dafür, dass der Zeiger seine gültigkeit behält im fremden Prozess. Mit selbst definierten Nachrichten wird es nicht gehen.
|
Re: Daten per Message übertragen (WM_COPYDATA?)
aha... das sind jetzt zwei widersprüchliche informationen... oder bezieht sich deine aussage nur auf WM_COPYDATA, ste_ett?
|
Re: Daten per Message übertragen (WM_COPYDATA?)
Zitat:
Diesen Pointer bekommt die Anwendung, an die du diese Fensternachricht schickst und kann dann darauf zugreifen. |
Re: Daten per Message übertragen (WM_COPYDATA?)
ok, danke.
|
Re: Daten per Message übertragen (WM_COPYDATA?)
SO, eine Frage hätt ich da noch: Bring ich ohne unschöne Trickserei (immerhin gibt es ja CopyDataStruct.cbData ;) ) einen string/PChar/array of char von beliebiger Länge in das Struct? Es geht hier konkret um einen dateinamen, den könnt ich natürlcih kurz halten, aber unbegrenzt wär schon schöner... Ich nehme mal an, ein PChar in meinem record würd irgendwo in meinen Adressraum zeigen, und der Zielapp nix anderes als AVs bescheren...
|
Re: Daten per Message übertragen (WM_COPYDATA?)
Moin Lukas,
schau Dir mal das letzte Element der Struktur an. |
Re: Daten per Message übertragen (WM_COPYDATA?)
ja klar, das ist ein pointer auf die daten, die ich übertragen will.
ich will aber einen record übertragen und in diesem record wiederum einen string. ohne größenbeschränkung wie z.B. string[255] oder array[0..1023] of char. EDIT: Ich könnte da natürlich ganz frech hergehen und mit Getmem und copy arbeiten, aber das will ich eigentlich nicht. genauso empfände ich es als unschön, zwei messages, eine mit den primitiven informationen und eine mit dem string zu senden. |
Re: Daten per Message übertragen (WM_COPYDATA?)
Zitat:
Delphi-Quellcode:
edit: die Empfangs-Proc ist natürlich eine Botschaftsbehandlungsroutine für WM_COPYDATA-Messages (die also auch entsprechend im Deklarationsteil der Form so zu deklarieren ist).
// Sende-Proc in einem "Prog A"
procedure TForm1.SendTextViaWMCopyData(Sender: TObject); var AStream : TMemoryStream; ACopyDataStruct : TCopyDataStruct; begin AStream := TMemoryStream.Create; RichEdit1.Lines.SaveToStream(AStream); with ACopyDataStruct do begin dwData := 0; cbData := AStream.Size; lpData := AStream.Memory; end; SendMessage(FindWindow(Nil,'Prog B'), WM_CopyData, Handle, integer(@ACopyDataStruct)); AStream.Free; end; // Empfangs-Proc in einem "Prog B" procedure TForm1.GetTextViaWMCopyData(var AMsg : TMessage); type PCopyDataStruct = ^TCopyDataStruct; var AStream : TMemoryStream; begin AStream := TMemoryStream.Create; AStream.Write(PCopyDataStruct(AMsg.LParam).lpData^,PCopyDataStruct(AMsg.LParam).cbData); AStream.Position := 0; RichEdit2.Lines.LoadFromStream(AStream); AStream.Free; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:32 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