2013-08-12 1 views
9

In der Header-Datei WinUser.h gibt es einen Teil, in dem die Konstanten des zweiten Parameters SetWindowLong() definiert sind.Wie rufe ich SetWindowLong() in den 64-Bit-Versionen von Windows auf?

// ... 

#define GWL_WNDPROC   (-4) 
#define GWL_HINSTANCE  (-6) 
#define GWL_HWNDPARENT  (-8) 
#define GWL_STYLE   (-16) 
#define GWL_EXSTYLE   (-20) 
#define GWL_USERDATA  (-21) 
#define GWL_ID    (-12) 

#ifdef _WIN64 

#undef GWL_WNDPROC 
#undef GWL_HINSTANCE 
#undef GWL_HWNDPARENT 
#undef GWL_USERDATA 

#endif /* _WIN64 */ 

#define GWLP_WNDPROC  (-4) 
#define GWLP_HINSTANCE  (-6) 
#define GWLP_HWNDPARENT  (-8) 
#define GWLP_USERDATA  (-21) 
#define GWLP_ID    (-12) 

// ... 

Aber sie sind direkt nach undefiniert, wenn _WIN64 definiert ist; und es ist in meinem 64-Bit-System definiert.

Wie Sie sehen, gibt es auch einen GWLP_*** Satz von Konstanten, aber sie sind nicht auf der Seite von SetWindowLong() dokumentiert.

Warum sind diese Konstanten in x64-Systemen nicht definiert?
Wie lautet die alternative Methode, SetWindowLong() in x64-Systemen aufzurufen?


Mein System:
OS: Windows 7 Ultimate x64 SP1
IDE: Visual Studio 2012 ultimative Update 3

+1

Ganz oben in der Dokumentation befindet sich * Hinweis Diese Funktion wurde durch die SetWindowLongPtr-Funktion ersetzt. Verwenden Sie die SetWindowLongPtr-Funktion, um Code zu schreiben, der mit 32-Bit- und 64-Bitversion von Windows kompatibel ist. * – chris

+0

@chir Ich kann diese Notiz in der Dokumentationsseite nicht finden, die ich in meiner Frage gab. – hkBattousai

+0

Ich denke, die mobile Version der Dokumentation enthält keine Notiz. – chris

Antwort

22

Einige der Fenster Datenwerte (diejenigen, die Objekte beziehen sich auf "Zeiger geschlichtet" wie die Fensterprozedur zum Beispiel) muss 64 Bit in einem x64 Build sein. Die alten SetWindowLong() und GetWindowLong() Funktionen sind auf DWORD Größe (32 Bit) -Werte für Abwärtskompatibilität beschränkt, und Microsoft haben neue Versionen eingeführt, SetWindowLongPtr() und GetWindowLongPtr(), mit denen Sie mit Zeiger-Größe Werte (32 Bit in einem 32-Bit-Build und 64 Bit in einem 64 Bit Build).

In diesen Tagen wird empfohlen, dass Sie immer SetWindowLongPtr() und die GWLP_xxx Konstanten verwenden, egal ob Sie 32 oder 64 Bit bauen für, aber in einer 64-Bit-bauen Sie Notwendigkeit die neuen Funktionen zu nutzen und so die definiert sind # undefiniert, um Buildfehler zu verursachen, die Sie zwingen, Ihren Code zu reparieren.

Verwandte Themen