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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top