2008-09-18 13 views
7

¿Cómo puedo lanzar largo a HWND (C++ visual studio 8)?long para HWND (VS8 C++)

Long lWindowHandler; 
HWND oHwnd = (HWND)lWindowHandler; 

pero me dio la siguiente advertencia:

advertencia C4312: 'tipo fundido': la conversión de 'long' a 'HWND' de mayor tamaño

Gracias.

Respuesta

8

HWND es un identificador para una ventana. Este tipo se declara en WinDef.h como sigue:

typedef MANGO HWND;

mango es manejar a un objeto. Este tipo se declara en WinNT.h de la siguiente manera:

typedef HERRAMIENTA DE OPCIÓN;

Finalmente, PVOID es un puntero a cualquier tipo. Este tipo se declara en WinNT.h de la siguiente manera:

typedef void * PVOID;

Por lo tanto, HWND es en realidad un puntero al vacío. Puede lanzar un long a un HWND como este:

HWND h = (HWND) my_long_var;

pero muy cuidadoso de la información que se almacena en my_long_var. Debes asegurarte de que tienes un puntero ahí.

Edición posterior: La advertencia sugiere que tiene activadas las comprobaciones de portabilidad de 64 bits. Si está creando una aplicación de 32 bits, puede ignorarlos.

9

Mientras usted está seguro de que el tiempo que tiene es realmente un HWND, entonces es tan simple como:

HWND hWnd = (HWND)(LONG_PTR)lParam; 
+0

Gracias por su respuesta. Lo intenté y recibí una advertencia: advertencia C4312: 'tipo de conversión': conversión de 'LARGO' a 'HWND' de mayor tamaño alguna sugerencia? Gracias. –

+1

Creo que esta es la mejor respuesta, '(HWND) long_ver' no funciona para mí. – ehsun7b

5

Hacer esto solo es seguro si no se está ejecutando en una versión de Windows de 64 bits. El tipo LONG es de 32 bits, pero el tipo HANDLE es probablemente de 64 bits. Necesitarás limpiar tu código 64 bits. En resumen, querrá cambiar el LONG a LONG_PTR.

:

No fundido punteros a int, long ULONG o DWORD. Si debe lanzar un puntero para probar algunos bits, establecer bits claros, o manipular su contenido, utilice el tipo UINT_PTR o INT_PTR.Estos tipos son tipos integrales que se escalan al tamaño de un puntero para Windows de 32 y 64 bits (por ejemplo, ULONG para 32 bits Windows y _int64 para 64 bits Windows). Por ejemplo, suponga que es portando el siguiente código:

ImageBase = (PVOID) ((ULONG) ImageBase | 1);

Como parte del proceso de transferencia, ya iba a cambiar el código de la siguiente manera:

ImageBase = (PVOID) ((ULONG_PTR) ImageBase | 1);

Uso UINT_PTR y INT_PTR donde apropiada (y si no está seguro de si se le pide, no hay daño en el uso por si acaso). Do no lanzar sus punteros a los tipos ULONG, LONG, INT, UINT o DWORD.

Nota que manejan se define como un void *, por lo typecasting un valor HANDLE a un valor ULONG para poner a prueba, establecer o claras el bajo orden de 2 bits es un error en Windows de 64 bits.

+1

Si bien su consejo es correcto para los punteros, consulte [esta respuesta sobre longitudes de identificador] (http://stackoverflow.com/a/29526711/2636001) (o [el artículo correspondiente de MSDN] (https://msdn.microsoft.com) /en-us/library/windows/desktop/aa384203%28v=vs.85%29.aspx))- 'HWND' solo usa los 32 bits más bajos y por lo tanto es seguro a través de los límites del proceso. – dst