![]() |
WM_COPYDATA 64Bit -> 32Bit
Ich bin am verzweiflen ;)
Hat irgendwer ein Beispiel wie ich aus einer 64Bit Anwenung (FPC) per WM_COPYDATA zu meiner 32Bit Anwendung Daten schicken kann? Irgendwei will das nicht und bekomme AV in meiner 32Bit Anwendung wenn ich auf die DAten zugreifen will. Bin mir auch nicht so sicher, wo ich nun 64Bit Pointer habe und wo nicht, und ob ich in meiner 32Bit Anwenundg was ändern muß oder nicht. Den es sieht ja so aus als ob die TCopyDataStruct Pointer hat, und diese ja dann 64 bit haben ... |
AW: WM_COPYDATA 64Bit -> 32Bit
Bei WM_COPYDATA brauchst du dir erstmal, wegen den Bits bei den Daten, keine Geganken machen.
Denn hier kümmert sich windows um die Speicherverwaltung. man schickt die Message ab, Windows ließt die übergebenen Daten aus, erstellt in der Zielanwendung eine neue Struktur, kopiert die Daten dort rein und übergibt erst dann alles an die andere Anwendung. Also sollte es so erstmal egal sein, ob man von 32 Bit auf 64 Bit oder andersrum Daten sendet. (OK, abgesehn davon, daß in der Zielanwendung nicht genügend Speicher für die zu versendeten Daten zur Verfügung stehen). |
AW: WM_COPYDATA 64Bit -> 32Bit
tja, das problem ist, das es leider nicht so funktioniert.
den das hätte ich auch schon gemacht, ich schau mir mal dann den aufruf von FPC an, vielleicht läuft da unter 64 bit noch was schief ... |
AW: WM_COPYDATA 64Bit -> 32Bit
ahhh .nocvh nicht ganz fix, aber sieht so aus als ob im FPC/Lazarus die Struktur falsch definiert ist ... da wird beim dwData ein DWORD verwendet muß aber ein ULONG_PTR verwendet werden
|
AW: WM_COPYDATA 64Bit -> 32Bit
Wo tritt denn die AV auf?
Du könntest dir ja auch erstmal an deine 32-Bit-Anwendung von einer anderen 32-Bit-Anwendung die Daten senden und shcauen ob es da läuft, sowie die Daten von deiner 64-Bit-Anwendung an eine andere 64-Bit-Testanwendung senden. Ansonsten bliebe auch noch MMF oder eine Pipe als Alternative. |
AW: WM_COPYDATA 64Bit -> 32Bit
64bit. Hmm? Zufällig Vista oder höher? Wenn ja, könnte es auch sein, daß dir ohnehin die Integrity Levels (
![]() |
AW: WM_COPYDATA 64Bit -> 32Bit
Wenn er von 64 auf die 32 Bit die Message sendet und die AV in 32 auftritt, also dem Ziel, dann muß es ja erfolgreich versendet worden sein? :gruebel:
Dieses Integrity Levels-Dingens sollte doch nur auftreten, wenn man Messages zwischen Anwendungen unterschiedlicher Rechte verwenden will? Also z.B. von einem billigen User-Prozess zu einem mit höheren Adminrechten. (wie z.B. Drag&Drop-Messages von einem normalen Explorer zu einer Anwendung mit Adminrechten) |
AW: WM_COPYDATA 64Bit -> 32Bit
Zitat:
Zitat:
Zitat:
|
AW: WM_COPYDATA 64Bit -> 32Bit
Die Ausrichtung (Alignment) der Strukturen ist eine andere. Schau mal, wie groß deine Strukturen in 64 und 32bit sind mit sizeof(). Bei 64bit brauchen solche Strukturen oftmals mehr Speicher als im 32bit Zielprozess allokiert wurde. WM_COPYDATA ist doch DDE?! Die Daten sind doch für den Zielprozess als Readonly zu betrachten, ich glaube daher nicht, dass Windows die Daten irgendwie konvertiert (außer in den Prozess zu kopieren).
|
AW: WM_COPYDATA 64Bit -> 32Bit
Also mittlerweile funkt es, das problem war im FPC bzw Lazarus, wo die TCopyDataStruct falsch definiert war, der Pointer Parameter war als DWORD definiert, und so kam nur müll in der 32Bit Anwendung an.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:17 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