Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi LPARAM nur bei Zeigern? 64Bit (https://www.delphipraxis.net/197741-lparam-nur-bei-zeigern-64bit.html)

EWeiss 31. Aug 2018 20:25


LPARAM nur bei Zeigern? 64Bit
 
Zitat:

Wenn Sie Zeiger an SendMessage/PostMessage/TControl.Perform übergeben, sollten die Parameter wParam und lParam in den Typ WPARAM/LPARAM und nicht in Integer/Longint umgewandelt werden.
Richtig:
SendMessage(hWnd, WM_SETTEXT, 0, LPARAM(@MyCharArray));

Falsch:
SendMessage(hWnd, WM_SETTEXT, 0, Integer(@MyCharArray));
Ok. .Das sollte klar sein..
Aber wie verhält es sich bei dieser Konstellation.

Delphi-Quellcode:
SendMessage(WinHandle, WM_COMMAND, MAKELONG(Word(MenuWahl), 0), 0);


MAKELONG ist ja eigentlich kein NativeUint..
WPARAM voran setzen oder ignorieren es funktioniert auch mit Integer.

Bin mir da jetzt nicht so sicher da es nicht erwähnt wird.
Die Infos sind alle etwas Halbfertig.

gruss

p80286 31. Aug 2018 22:50

AW: LPARAM nur bei Zeigern? 64Bit
 
Soweit ich das verstanden habe erwartet Windows einen 64Bit Wert, MAKELONG liefert aber nur einen 32Bit Wert. D.h. die hoch(wertigen) 32Bit sind nicht definiert.

Gruß
K-H

EWeiss 31. Aug 2018 22:55

AW: LPARAM nur bei Zeigern? 64Bit
 
Zitat:

Zitat von p80286 (Beitrag 1412164)
Soweit ich das verstanden habe erwartet Windows einen 64Bit Wert, MAKELONG liefert aber nur einen 32Bit Wert. D.h. die hoch(wertigen) 32Bit sind nicht definiert.

Gruß
K-H

Das Problem ist das einige Leute sagen man soll die Werte so belassen wie sie sind und nur ausschließlich Zeiger Konvertieren über LPARAM als Beispiel.
Das ist wieder so eine Sache das man nicht weis was am ende der richtige weg ist.
Rein technisch gesehen würde ich es so auslegen.

Delphi-Quellcode:
SendMessage(WinHandle, WM_COMMAND, WPARAM(MAKELONG(Word(MenuWahl), 0)), 0);


Nur nicht jeder ist der gleichen Meinung.
Hier zum Beispiel!
Zitat:

I'd suggest don't use NativeInt or NativeUInt for non-pointer-based values. Try to keep your code semantically the same between 32-bit and 64-bit. If you need 32 bits of range, use Integer; if you need 64 bits, use Int64. That way your code should run the same on both bitnesses. Only if you're casting to and from a Pointer value of some kind, such as a reference or a THandle, should you use NativeInt.
gruss

KodeZwerg 31. Aug 2018 23:07

AW: LPARAM nur bei Zeigern? 64Bit
 
Hi Emil!

Hast Du Dir schon mal das MAKELONGLONG angeschaut?



Grüße

-Marc

EWeiss 31. Aug 2018 23:11

AW: LPARAM nur bei Zeigern? 64Bit
 
Zitat:

Zitat von KodeZwerg (Beitrag 1412167)
Hi Emil!

Hast Du Dir schon mal das MAKELONGLONG angeschaut?



Grüße

-Marc

Was willst du mir damit sagen?

gruss

KodeZwerg 31. Aug 2018 23:14

AW: LPARAM nur bei Zeigern? 64Bit
 
Na ich wollte darauf hinaus wie Du Windows Deine 32bit Variable verkaufen könntest. Also aus der MAKELONG eine MAKELONGLONG. Tut mir leid wenn Ansatz falsch ist.

EWeiss 31. Aug 2018 23:17

AW: LPARAM nur bei Zeigern? 64Bit
 
Zitat:

Zitat von KodeZwerg (Beitrag 1412169)
Na ich wollte darauf hinaus wie Du Windows Deine 32bit Variable verkaufen könntest. Also aus der MAKELONG eine MAKELONGLONG. Tut mir leid wenn Ansatz falsch ist.

Ach so..
Nun muss erst mal sehen ob MAKELONGLONG NativeUint ist! (Nein ist UInt64) damit kann ich nichts anfangen.
Denn darum geht es.. ;)

Meine Frage bezog sich auf NativeUint denn das ist der Typ der von SendMessage bei WPARAM erwartet wird.
Nicht um MAKELONG (Integer) oder MAKELONGLONG (UInt64)

Ich möchte also wissen ob ich bei Sendmessage weiterhin Integer schicken oder den Typ hier als Beispiele MAKELONG (könnte auch was anderes sein) nach NativeUint konvertieren soll.
Denn darüber gibt es unterschiedliche Ansichten. (Siehe mein Link)

Zitat:

I'd suggest don't use NativeInt or NativeUInt for non-pointer-based values.
Zustimmen oder verweigern ;)

gruss

Dalai 1. Sep 2018 00:29

AW: LPARAM nur bei Zeigern? 64Bit
 
LPARAM und WPARAM sind definiert als INT_PTR bzw. UINT_PTR und diese wiederum sind NativeInt und NativeUInt. Daher sehe ich nicht wirklich ein Problem, wenn du simpel einen Cast nach LPARAM bzw. WPARAM machst - eben genau das, was SendMessage erwartet.

Grüße
Dalai

EWeiss 1. Sep 2018 00:36

AW: LPARAM nur bei Zeigern? 64Bit
 
Zitat:

Zitat von Dalai (Beitrag 1412173)
LPARAM und WPARAM sind definiert als INT_PTR bzw. UINT_PTR und diese wiederum sind NativeInt und NativeUInt. Daher sehe ich nicht wirklich ein Problem, wenn du simpel einen Cast nach LPARAM bzw. WPARAM machst - eben genau das, was SendMessage erwartet.

Grüße
Dalai

Ich weis welche Typen das sind..
Darum geht es nicht wie schon gesagt man ist da unterschiedlicher Meinung.
Zudem möchte ich die 32Bit Kompatibilität wenn möglich mit gleichem Code erhalten.

OK.. werde mal schauen ob es in er Zukunft Probleme bereitet wenn ich es so belasse wie es ist.
Ich glaube da gibt es keine pauschale Lösung für.

Danke!

gruss

Dalai 1. Sep 2018 00:41

AW: LPARAM nur bei Zeigern? 64Bit
 
Zitat:

Zitat von EWeiss (Beitrag 1412174)
Zudem möchte ich die 32Bit Kompatibilität wenn möglich mit gleichem Code erhalten.

Und die Kompatibilität besteht nicht bei der Verwendung eines Casts nach LPARAM/WPARAM, weil...? :gruebel:

Will sagen: Ich sehe kein Problem, einfach immer und in jedem Fall nach LPARAM/WPARAM zu casten, völlig egal, was da reingegeben wird. Das geht natürlich nur, solange der reingegebene Datentyp nicht zu groß ist, aber das ist ja eh klar, und unabhängig von SendMessage und dessen Funktionsparametern.

Grüße
Dalai


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:54 Uhr.
Seite 1 von 2  1 2      

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