2013-08-12 11 views
9

W pliku nagłówkowym WinUser.h znajduje się część, w której zdefiniowano stałe drugiego parametru SetWindowLong().Jak wywołać funkcję SetWindowLong() w 64-bitowych wersjach systemu Windows?

// ... 

#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) 

// ... 

Ale są one tuż po niezdefiniowaniu, jeśli zdefiniowano _WIN64; i jest zdefiniowany w moim 64-bitowym systemie.

Jak widać, istnieje również zestaw stałych GWLP_***, ale nie są one udokumentowane na stronie SetWindowLong().

Dlaczego te stałe są niezdefiniowane w systemach x64?
Jaki jest alternatywny sposób wywoływania SetWindowLong() w systemach x64?


Mój system:
OS: Windows 7 Ultimate x64 SP1
IDE Visual Studio 2012 Ostateczny Update 3

+1

U góry dokumentacji znajduje się * Uwaga Ta funkcja została zastąpiona przez funkcję SetWindowLongPtr. Aby napisać kod, który jest kompatybilny zarówno z 32-bitowymi, jak i 64-bitowymi wersjami systemu Windows, użyj funkcji SetWindowLongPtr. * – chris

+0

@chir Nie mogę znaleźć tej notatki na stronie dokumentacji podanej w pytaniu. – hkBattousai

+0

Chyba wersja mobilna dokumentacji nie zawiera notatki. – chris

Odpowiedz

22

Niektóre wartości okno danych (te, które odnoszą się do "wskaźnik wielkości" obiektów tak jak procedura okna, na przykład) musi być 64-bitowa w kompilacji x64. Stare funkcje SetWindowLong() i GetWindowLong() są ograniczone do DWORD (32-bitowe) wartości dla kompatybilności wstecznej, a firma Microsoft wprowadziła nowe wersje, SetWindowLongPtr() i GetWindowLongPtr(), które umożliwiają pracę z wartościami wielkości wskaźnika (32-bitowe w 32-bitowej wersji). 64-bitowy w wersji 64-bitowej).

Obecnie zaleca się, aby zawsze używać SetWindowLongPtr() i GWLP_xxx stałe, czy budujesz dla 32 lub 64 bit, ale w 64 bit budować cię potrzebę do korzystania z nowych funkcji i tak definiuje są # nieokreślone, powodujące błędy kompilacji, które zmuszają cię do naprawienia kodu.

Powiązane problemy