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
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.691 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.691 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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.316 Beiträge
 
Delphi 12 Athens
 
#7

AW: LPARAM nur bei Zeigern? 64Bit

  Alt 1. Sep 2018, 01:52
Integer(@MyCharArray) ist falsch, weil es unter 64 Bit den Wert abschneidet und Daten vernichtet.

MAKELONG an LPARAM gibt keinerlei Probleme, da der kleinere Wert immer in den Größeren rein passt.


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.
Falsch verstanden.

TypeCast bei Integer-Typen ... dabei wird korrekt umgewandelt, also die höheren Bits werden mathematisch "aufgefüllt".
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: LPARAM nur bei Zeigern? 64Bit

  Alt 1. Sep 2018, 01:54
Zitat:
Integer(@MyCharArray) ist falsch, weil es unter 64 Bit den Wert abschneidet und Daten vernichtet.
Ja deshalb verwende ich ja bei Pointern auch LPARAM.

Zitat:
MAKELONG an NativeUInt gibt keinerlei Probleme, da der kleiner Wert immer in den größeren rein passt.
Ok Danke.. dann ist das geklärt und ich weis worauf ich achten muss.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: LPARAM nur bei Zeigern? 64Bit

  Alt 1. Sep 2018, 10:25
TypeCast bei Integer-Typen ... dabei wird korrekt umgewandelt, also die höheren Bits werden mathematisch "aufgefüllt".
Danke, gut zu wissen.
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.316 Beiträge
 
Delphi 12 Athens
 
#10

AW: LPARAM nur bei Zeigern? 64Bit

  Alt 1. Sep 2018, 14:21
Neu bei expliziten Casts von ordinalen Typen (z.B. Integer) wo beie Seiten die selbe Größe (Bits/Bytes) besitzen, da wird ohne Wert-Umrechnung gearbeitet.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort

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 08:09 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 by Thomas Breitkreuz