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/)
-   -   [x64] SendMessage nimmt lparam nicht an (https://www.delphipraxis.net/195622-%5Bx64%5D-sendmessage-nimmt-lparam-nicht.html)

DCoderHH 14. Mär 2018 10:58

[x64] SendMessage nimmt lparam nicht an
 
Ich stelle meinen Code von 32 auf 64-bit um. Datei gibt es diesen Fehler:

Code:
[dcc64 Fehler] E2089 Ungültige Typumwandlung
in diesem Code

Delphi-Quellcode:
var
  wnd: HWND;
  Pt: TPoint;
  i: Integer;
 
begin
  ...
  i := SendMessage(wnd, LB_ITEMFROMPOINT, 0, ***lparam(PointToSmallpoint(Pt))***); <-- Fehler bei ***
  ...
end;
Was ist die Lösung dafür? Danke!

himitsu 14. Mär 2018 11:06

AW: [x64] SendMessage nimmt lparam nicht an
 
In diesem Fall besser Integer/LongInt statt LPARAM verwenden.

SmallPoint hat überall die selbe Größe.

DCoderHH 14. Mär 2018 11:42

AW: [x64] SendMessage nimmt lparam nicht an
 
Zitat:

Zitat von himitsu (Beitrag 1396071)
In diesem Fall besser Integer/LongInt statt LPARAM verwenden.

SmallPoint hat überall die selbe Größe.

Danke, mit Integer(...) geht's. Wundert mich nur etwas, dass der Parameter von SendMessage vom Typ LPARAM ist und nicht vom Typ Integer...

Uwe Raabe 14. Mär 2018 11:52

AW: [x64] SendMessage nimmt lparam nicht an
 
Zitat:

Zitat von DCoderHH (Beitrag 1396076)
Wundert mich nur etwas, dass der Parameter von SendMessage vom Typ LPARAM ist und nicht vom Typ Integer...

Na ja, der Parameter ist nun mal vom Typ LPARAM. Lediglich dein Cast funktioniert damit nicht, da unter 64-Bit ein TSmallPoint eben eine andere Größe hat als LPARAM. Nach dem Cast auf Integer erweitert der Compiler den Integer-Wert dann implizit auf LPARAM.

Stevie 14. Mär 2018 12:03

AW: [x64] SendMessage nimmt lparam nicht an
 
Deshalb benutzt man ja auch PointToLParam ;)

KodeZwerg 14. Mär 2018 23:11

AW: [x64] SendMessage nimmt lparam nicht an
 
Delphi-Quellcode:
MakeLParam( Pt.X, Pt.Y )
sollte auch reibungslos funktionieren falls es nicht das gleiche ist.

himitsu 15. Mär 2018 07:52

AW: [x64] SendMessage nimmt lparam nicht an
 
Zitat:

Zitat von KodeZwerg (Beitrag 1396164)
Delphi-Quellcode:
MakeLParam( Pt.X, Pt.Y )
sollte auch reibungslos funktionieren falls es nicht das gleiche ist.

Fast.

Hier natürlich am Ziel nicht nach TPoint casten, sondern den lParam "richtig" konvertieren.

Warum ist Windows hier nicht konsequent?

Delphi-Quellcode:
lParam = MakeLParam(MyX, MyY)
lParam = PointToLParam(MyPoint)
lParam = SmallPointToPoint(MySmallPoint)
Aber die Umkehrfunktionen fehlen.

So wie es auch hier gemacht wurde.
Delphi-Quellcode:
function RGB(r, g, b: Byte): COLORREF;
function GetRValue(rgb: DWORD): Byte;
function GetGValue(rgb: DWORD): Byte;
function GetBValue(rgb: DWORD): Byte;

type
  LOWORD = Word;
  LOBYTE = Byte;
function MakeWord(A, B: Byte): Word;
function MakeLong(A, B: Word): Longint;
function HiWord(L: DWORD): Word;
function HiByte(W: Word): Byte;
MakeLong <> HiWord und LoWord
MakeWord <> HiByte und LoByte


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz