Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi WM_COPYDATA Empfänger verändert Daten (https://www.delphipraxis.net/98162-wm_copydata-empfaenger-veraendert-daten.html)

Billi Berserker 22. Aug 2007 14:03


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:
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;
In der Anwendung welche die WM_COPYDATA Nachricht geschickt hat kommt die Änderung nur leider nicht an.

Gibt es irgendetwas zu beachten wenn man die mit WM_COPYDATA empfangenen daten verändern will?

Apollonius 22. Aug 2007 14:07

Re: WM_COPYDATA Empfänger verändert Daten
 
Zitat:

Zitat von MSDN
The receiving application should consider the data read-only

War wohl nix. Du solltest an den Sender die neuen Daten zurückschicken, falls es möglich ist, ein Sender-Handle zu kriegen. Das steht laut MSDN normalerweise im wParam.

Billi Berserker 22. Aug 2007 14:14

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... http://msdn2.microsoft.com/en-us/library/ms647846.aspx
Damit sollte es denke ich klappen :)

sirius 22. Aug 2007 14:19

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