![]() |
Delphi 12 und SendMessage
Hallo,
ich habe ein Programm unter Delphi 12 kompiliert und nun funktioniert SendMessage mit WM_COPYDATA nicht mehr. Die Zielanwendung(en) erhalten keine Nachricht. Das Handle der Zielanwendung(en) passt. Die Anwendungen haben unterschiedliche Architekturen (x64 und x86). Was wurde denn da von D11 auf D12 geändert? Gruß Andreas |
AW: Delphi 12 und SendMessage
Per se sollte es ja gehn, auch zwischen x68 und x64.
Erstmal das Einfachste prüfen: * Dein Code, welchen wir nicht kennen, ist wirklich korrekt? * Du prüfst auch die Parameter/Rückgabewerte? z.B. FindWindow usw. finden das Ziel auch Ja, bei WM_COPYDATA steht nur war vom Result und nichts bezüglich weiterer Auswertungen, wie z.B. GetLastError, aber versuchen kann man's ja mal.
Delphi-Quellcode:
* Die Prozesse laufen nicht mit unterschiedlichen Rechten?
SetLastError(ERROR_CURRENT_DIRECTORY); // es ginge auch SetLastError(NO_ERROR), aber so haben wir war zur verifications, ob GetLastError hier wirklich nichts bewirkt
if not BOOL(SendMessage(DestWindowHandle, WM_COPYDATA , WPARAM(Self.Handle), LPARAM(@MyCopyDataStruct)) then // oder besser SendMessageTimeout RaiseLastORError; z.B. eine Restricted App versucht nciht was an eine Admin-App zu schicken? * Am einfachsten laufen beide im selben Nutzeraccount? Nicht vieleicht in unterschiedlichen Sessions oder Dergleichen. Es gab noch irgendwie was, womit man "gesperrte" Messages aus anderen Prozessen erlauben kann, aber ich finde da nichts zu, vor allem nicht bezüglich WM_COPYDATA (welches als Austauschformat, vermutlich eh nicht gesperrt wird) |
AW: Delphi 12 und SendMessage
Das Handle der Zielanwendung passt. Selber Account, gleiche Rechte.
Also auf das einfachste reduziert sieht es aus wie folgt. In Delphi <=11 kann ich das unter x86 und x64 kompilieren und es klappt mit Zielanwendungen beider Architekturen. In Delphi 12 kann ich es nur noch unter x86 kompilieren, sonst ist es ohne Funktion.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin Send_Quickdata('DTprjno;123456'); end; function TForm1.Send_Quickdata(msg:string):boolean; var aCopyData: TCopyDataStruct; hTargetWnd: HWND; begin hTargetWnd := FindWindowEx(0, 0, nil, Pchar ('QuickData')); if hTargetWnd <> 0 then begin with aCopyData do begin dwData := 0; cbData := (StrLen(Pchar(msg)) + 1)* SizeOf(Char); lpData := Pchar (msg); end; // Search window by the window title // Fenster anhand des Titelzeilentext suchen SendMessage(hTargetWnd, WM_COPYDATA, Longint(Handle), Longint(@aCopyData)); result:=true; end else result:=false; end; |
AW: Delphi 12 und SendMessage
Hi,
Just an idea, i don't have Delphi 12, but form what i read there is change in default Integer and NativeInt... So please check the size of TCopyDataStruct in both Delphi 11 and 12, may be something broke there with dwData, It would be nice if you shared with us the SizeOf(TCopyDataStruct) in the 4 cases Delphi 11 and Delphi 12 for application with 32bit and 64bit. |
AW: Delphi 12 und SendMessage
Da gibt es Abweichungen.
showmessage(inttostr(sizeof(aCopyData))); D11 x64=24 x86=12 D12 x64=8 x86=4 |
AW: Delphi 12 und SendMessage
Ich mache noch weitere Tests, aber so scheint es zu klappen:
Delphi-Quellcode:
SendMessage(hTargetWnd, WM_COPYDATA, NativeUInt(Handle), NativeInt(@aCopyData));
|
AW: Delphi 12 und SendMessage
Und so?
Delphi-Quellcode:
SendMessage(hTargetWnd, WM_COPYDATA, wParam(Handle), lParam(@aCopyData));
|
AW: Delphi 12 und SendMessage
Das klappt auch.
Wenn man die Definitionen für wParam und lParam verfolgt, landet man ja letztendlich bei NativeUInt und NativeInt. |
AW: Delphi 12 und SendMessage
Das im Post #5 (für D12) kann eigentlich nicht stimmen.
Wie ist denn TCopyDataStruct deklariert? (Strg+Linkklick aka "Deklaration suchen") |
AW: Delphi 12 und SendMessage
Zitat:
First i put SizeOf(TCopyDataStruct) not sizeof(aCopyData), why it is important because 8 and 4 are the size of single and simple pointer, not a record (struct), and 8 and 4 looks like a pointer something like PCopyDataStruct not TCopyDataStruct, or you just used @aCopyData by mistake. Second as rule of thumb, never ever use with SendMessage, PostMessage... parameters other than WPARAM and LPARAM, or just cast them. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:54 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