lungo su HWND (VS8 C++)
-
01-07-2019 - |
Domanda
Come posso trasmettere a lungo su HWND (C++ visual studio 8)?
Long lWindowHandler;
HWND oHwnd = (HWND)lWindowHandler;
Ma ho ricevuto il seguente avviso:
avviso C4312:'tipo cast' :conversione da 'LONG' a 'HWND' di dimensione maggiore
Grazie.
Soluzione 2
HWND è un handle per una finestra.Questo tipo è dichiarato in WinDef.h come segue:
typedef MANIGLIA HWND;
HANDLE è l'handle di un oggetto.Questo tipo è dichiarato in WinNT.h come segue:
typedef MANIGLIA PVOID;
Infine, PVOID è un puntatore a qualsiasi tipo.Questo tipo è dichiarato in WinNT.h come segue:
typedef void *PVOID;
Quindi, HWND è in realtà un puntatore al vuoto.Puoi lanciare un long su un HWND in questo modo:
HWND h = (HWND)my_long_var;
ma fai molta attenzione a quali informazioni sono memorizzate in my_long_var.Devi assicurarti di avere un puntatore lì dentro.
Modifica successiva:L'avviso suggerisce che hai attivato i controlli di portabilità a 64 bit.Se stai creando un'applicazione a 32 bit puoi ignorarli.
Altri suggerimenti
Finché sei sicuro che il LONG che hai sia davvero un HWND, allora è semplice come:
HWND hWnd = (HWND)(LONG_PTR)lParam;
Farlo è sicuro solo se non stai utilizzando una versione di Windows a 64 bit.Il tipo LONG è a 32 bit, ma il tipo HANDLE è probabilmente a 64 bit.Dovrai rendere il tuo codice pulito a 64 bit.In breve, vorrai cambiare LONG in LONG_PTR.
Regole per l'utilizzo dei tipi di puntatore:
Non lanciare puntatori su Int, Long, Ulong o Dword.Se è necessario lanciare un puntatore per testare alcuni bit, impostare o cancellare bit o manipolare altrimenti il suo contenuto, utilizzare il tipo Uint_ptr o int_ptr.Questi tipi sono tipi integrali che si adattano alla dimensione di un puntatore per le finestre a 32 e 64 bit (ad esempio, Ulong per finestre a 32 bit e _int64 per finestre a 64 bit).Ad esempio, supponiamo che tu stia portando il seguente codice:
ImageBase = (pVoid) ((Ulong) ImageBase | 1);
Come parte del processo di porting, cambieresti il codice come segue:
ImageBase = (pVoid) ((Ulong_ptr) ImageBase | 1);
Usa uint_ptr e int_ptr se del caso (e se non si è certi se sono richiesti, non vi è alcun danno nell'usarli per ogni evenienza).Non lanciare i tuoi puntatori sui tipi Ulong, Long, Int, Uint o Dword.
Si noti che la maniglia è definita come un vuoto*, quindi tipografi un valore dell'impugnatura a un valore Ulong per testare, impostare o cancellare i 2 bit a basso ordine è un errore su finestre a 64 bit.