AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi LPARAM nur bei Zeigern? 64Bit

LPARAM nur bei Zeigern? 64Bit

Ein Thema von EWeiss · begonnen am 31. Aug 2018 · letzter Beitrag vom 1. Sep 2018
Antwort Antwort
Seite 1 von 2  1 2   
EWeiss
(Gast)

n/a Beiträge
 
#1

LPARAM nur bei Zeigern? 64Bit

  Alt 31. Aug 2018, 21:25
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.

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

Geändert von EWeiss (31. Aug 2018 um 21:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: LPARAM nur bei Zeigern? 64Bit

  Alt 31. Aug 2018, 23:50
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: LPARAM nur bei Zeigern? 64Bit

  Alt 31. Aug 2018, 23:55
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.

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

Geändert von EWeiss (31. Aug 2018 um 23:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: LPARAM nur bei Zeigern? 64Bit

  Alt 1. Sep 2018, 00:07
Hi Emil!

Hast Du Dir schon mal das MAKELONGLONG angeschaut?



Grüße

-Marc
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: LPARAM nur bei Zeigern? 64Bit

  Alt 1. Sep 2018, 00:11
Hi Emil!

Hast Du Dir schon mal das MAKELONGLONG angeschaut?



Grüße

-Marc
Was willst du mir damit sagen?

gruss
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: LPARAM nur bei Zeigern? 64Bit

  Alt 1. Sep 2018, 00:14
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: LPARAM nur bei Zeigern? 64Bit

  Alt 1. Sep 2018, 00:17
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

Geändert von EWeiss ( 1. Sep 2018 um 00:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.679 Beiträge
 
Delphi 5 Professional
 
#8

AW: LPARAM nur bei Zeigern? 64Bit

  Alt 1. Sep 2018, 01:29
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: LPARAM nur bei Zeigern? 64Bit

  Alt 1. Sep 2018, 01:36
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

Geändert von EWeiss ( 1. Sep 2018 um 01:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.679 Beiträge
 
Delphi 5 Professional
 
#10

AW: LPARAM nur bei Zeigern? 64Bit

  Alt 1. Sep 2018, 01:41
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...?

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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:27 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