2013-08-12 10 views
9

Nel file di intestazione WinUser.h, c'è una parte in cui sono definite le costanti del secondo parametro di SetWindowLong().Come si chiama SetWindowLong() nelle versioni a 64 bit di 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) 

// ... 

ma sono subito dopo indefinito se _WIN64 è definito; ed è definito nel mio sistema a 64 bit.

Come si vede, c'è anche un set di costanti GWLP_***, ma non sono documentate nella pagina di SetWindowLong().

Perché queste costanti non sono definite nei sistemi x64?
Qual è il modo alternativo di chiamare SetWindowLong() in sistemi x64?


Il mio sistema:
OS: Windows 7 Ultimate x64 SP1
IDE di Visual Studio 2012 ultimo Update 3

+1

Nella parte superiore della documentazione è * Nota Questa funzione è stata sostituita dalla funzione SetWindowLongPtr. Per scrivere codice compatibile con entrambe le versioni di Windows a 32 e 64 bit, utilizzare la funzione SetWindowLongPtr. * – chris

+0

@chir Non riesco a trovare quella nota nella pagina di documentazione che ho fornito nella mia domanda. – hkBattousai

+0

Suppongo che la versione mobile della documentazione non includa la nota. – chris

risposta

22

Alcuni dei valori dei dati finestra (quelli che si riferiscono a "dimensioni puntatore" oggetti come la procedura della finestra, per esempio) devono essere 64 bit in una build x64. Le vecchie funzioni SetWindowLong() e GetWindowLong() sono limitate ai valori DWORD di dimensioni (32 bit) per la compatibilità con le versioni precedenti e Microsoft ha introdotto nuove versioni, SetWindowLongPtr() e GetWindowLongPtr() che consentono di lavorare con valori di dimensioni puntatore (32 bit in una build a 32 bit e 64 bit in una build a 64 bit).

In questi giorni si consiglia di utilizzare sempre SetWindowLongPtr() ei GWLP_xxx costanti, se si sta costruendo per 32 o 64 bit, ma in un po '64 si costruiscono necessità di utilizzare le nuove funzioni e così le definisce sono # indefinito per causare errori di compilazione che ti costringono a correggere il tuo codice.

Problemi correlati