![]() |
WM_COPYDATA Empfänger verändert Daten
Ich lege mir gerade etwas die Karten bei der implementierung eines AppBar message handlers.
Meine Anwendnung empfängt über WM_COPYDATA ein record welches auch bisher Problemlos ausgelesen werden kann. Nun muß meine Anwendung jedoch die Daten die sie per Pointer bekommen hat verändern so das die Anwendung welches die Daten geschickt hat diese Veränderung am Ende mitbekommt. Und genau daran scheitert ich gerade etwas. Ich hab mir soweit überlegt einfach auf die Daten mittels eines Pointers zuzugreifen und sie direkt zu ändern.
Delphi-Quellcode:
In der Anwendung welche die WM_COPYDATA Nachricht geschickt hat kommt die Änderung nur leider nicht an.
type
TAppBarDataV2 = record cbSize : DWord; Wnd : HWND; uCallBackMessage : UINT; uEdge : UINT; rc : TRECT; lparam : LPARAM; dw64BitAlign : DWORD; end; pAppBarDataV2 = ^TAppBarDataV2; TAppBarMsgDataV2 = record abd : TAppBarDataV2; dwMessage : DWORD; hSharedMemory : HWND; dwSourceProcessID : DWORD; dw64BitAlign : DWORD; end; pAppBarMsgDataV2 = ^TAppBarMsgDataV2; procdure IncomingMessage(msg : TMessage); var AppBarMsgData : pAppBarMsgDataV2; data: pCopyDataStruct; begin Data := pCopyDataStruct(Msg.LParam); AppBarMsgData := pAppBarMsgDataV2(Data.lpData); // Daten ändern AppBarMsgData.abd.rc.Left := 123; msg.result := 1; end; Gibt es irgendetwas zu beachten wenn man die mit WM_COPYDATA empfangenen daten verändern will? |
Re: WM_COPYDATA Empfänger verändert Daten
Zitat:
|
Re: WM_COPYDATA Empfänger verändert Daten
Ah danke für den Hinweis...
etwas rum suchen diesbezüglich hat mich jetzt auf SHLockShared und SHUnlockShared geführt... ![]() Damit sollte es denke ich klappen :) |
Re: WM_COPYDATA Empfänger verändert Daten
Wenn du in einem anderen Prozess bist, geht das auch nicht, da der virtuelle Adressraum ein ganz anderer ist.
Du kannst nicht so einfach in einem anderen Prozess rumschreiben. Und innerhalb eines Prozesses braucht man ja auch nicht zwingend WM_copyData. Da hilft eine einfache Message mit dem Pointer. Lösungen für 2 Prozesse: 1. Message zurückschicken (siehe appolinares) 2. Pointer über normale Message schicken und dann mit Readprocessmemory und Writeprocessmemory arbeiten (sowie openprocess, etc) [roter Kasten] aha, kenne ich nicht |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:14 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