![]() |
GetWindowLong versus GetWindowLongPtr
Hallo Delphifreunde!
In der ![]() ![]() Das ist insofern erst einmal irreführend, weil suggeriert wird, daß man die GetWindowLongPtr-Funktion mit nur einem universellen Quelltext für beide Plattformen benutzen kann, doch unter Win32 gibt es sie nicht. Man muß mithin mit Compilerschaltern arbeiten. Doch nun stellt sich (mir) die Frage, ob das überhaupt nötig ist. Mit anderen Worten: Was macht GetWindowLongPtr unter 64 Bit der dort auch verfügbaren GetWindowLong-Funktion überlegen? Ich benutzte, ohne dieses Detail zu kennen, GetWindowLong nämlich auch schon unter 64 Bit und konnte keinerlei Funktionseinbußen gegenüber 32 Bit erkennen. |
AW: GetWindowLong versus GetWindowLongPtr
Zitat:
// EDIT: Ach ja, der Satz in der MSDN Bibliothek bezog sich logischerweise auf die Headerdateien, die im SDK zur Einbindung der Funktionen zur Verfügung stehen. Und dort ist es ebenso definiert (in der winuser.h). |
AW: GetWindowLong versus GetWindowLongPtr
Zitat:
Das ist dann aber geschummelt / gemogelt: GetWindowLongPtr gibt es erst ab 64 Bit, und wenn man GetWindowLongPtr in XE einsetzt (das ja noch keine 64 Bit beherrscht), dann wird in Wirklichkeit, also intern GetWindowLong verwendet. Steht sozusagen etwas anderes drauf, als verpackt ist. Ob das in XE 2 und Lazarus auch so ist, weiß ich nicht, zur Not könnte man das ja über externe DLL-Routineaufrufe deklarieren. Nur, welchen Vorteil es bringt oder ob es gar nötig ist (vermutlich eher nicht), das geht aus der MS-Beschreibung leider nicht hervor. Ergänzung: GetWindowLongPtr kennt Lazarus auch in 32 Bit. Ich werde einfach GetWindowLongPtr für die Lazarus- und XE2-Quelltexte benutzen, um 32- und 64-Bit-Compilate zu erzeugen. Sollen sich doch Lazarus und XE 2 darum kümmern, daß das richtige verwendet wird... Ergänzung 2: Komfortabel wäre es, wenn es auch umgekehrt funktionieren würde, d.h., wenn man GetWindowLong schreibt und auch das geprüft würde, so daß intern auf GetWindowLongPtr bei der Erzeugung von 64-Bit-Compilaten verwendet würde. |
AW: GetWindowLong versus GetWindowLongPtr
Zitat:
Zitat:
Delphi-Quellcode:
function GetWindowLong(hWnd: HWND; nIndex: Integer): NativeInt;
begin Result := GetWindowLongPtr(hWnd, nIndex); end; |
AW: GetWindowLong versus GetWindowLongPtr
Zitat:
|
AW: GetWindowLong versus GetWindowLongPtr
GetWindowLongPtr wird entsprechend der Headerdateien aus dem SDK und der Doku wiederum auf GetWindowLong gemappt. Wenn du aber direkt GetWindowLong aufrufst, landest du erst über GetWindowLongPtr bei der echten API-Funktion GetWindowLong.
Daher macht es eben Sinn GetWindowLongPtr zu verwenden, weil das der direkteste Weg ist und auch überall funktioniert. ;-) |
AW: GetWindowLong versus GetWindowLongPtr
Danke!
Zitat:
Zitat:
|
AW: GetWindowLong versus GetWindowLongPtr
Für irgendwas müssen die Quellcodes ja gut sein.
Delphi-Quellcode:
Aber wer erkennt den Fehler?
function GetWindowLong(hWnd: HWND; nIndex: Integer): NativeInt;
begin Result := GetWindowLongPtr(hWnd, nIndex); end; function GetWindowLongA(hWnd: HWND; nIndex: Integer): NativeInt; begin Result := GetWindowLongPtr(hWnd, nIndex); end; function GetWindowLongW(hWnd: HWND; nIndex: Integer): NativeInt; begin Result := GetWindowLongPtr(hWnd, nIndex); end; {$IFDEF WIN64} function GetWindowLongPtr; external user32 name 'GetWindowLongPtrW'; function GetWindowLongPtrA; external user32 name 'GetWindowLongPtrA'; function GetWindowLongPtrW; external user32 name 'GetWindowLongPtrW'; ... {$ELSE} function GetWindowLongPtr; external user32 name 'GetWindowLongW'; function GetWindowLongPtrA; external user32 name 'GetWindowLongA'; function GetWindowLongPtrW; external user32 name 'GetWindowLongW'; ... {$ENDIF} |
AW: GetWindowLong versus GetWindowLongPtr
Müßte es nicht so:
Delphi-Quellcode:
lauten?
function GetWindowLong(hWnd: HWND; nIndex: Integer): NativeInt;
begin Result := GetWindowLongPtr(hWnd, nIndex); end; function GetWindowLongA(hWnd: HWND; nIndex: Integer): NativeInt; begin Result := GetWindowLongPtrA(hWnd, nIndex); end; function GetWindowLongW(hWnd: HWND; nIndex: Integer): NativeInt; begin Result := GetWindowLongPtrW(hWnd, nIndex); end; {$IFDEF WIN64} function GetWindowLongPtr; external user32 name 'GetWindowLongPtrW'; function GetWindowLongPtrA; external user32 name 'GetWindowLongPtrA'; function GetWindowLongPtrW; external user32 name 'GetWindowLongPtrW'; ... {$ELSE} function GetWindowLongPtr; external user32 name 'GetWindowLongW'; function GetWindowLongPtrA; external user32 name 'GetWindowLongA'; function GetWindowLongPtrW; external user32 name 'GetWindowLongW'; ... {$ENDIF} |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:51 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