Pregunta

¿Cómo puedo transmitir mucho tiempo a HWND (C++ Visual Studio 8)?

Long lWindowHandler;
HWND oHwnd = (HWND)lWindowHandler;

Pero recibí la siguiente advertencia:

advertencia C4312:'tipo de reparto':conversión de 'LONG' a 'HWND' de mayor tamaño

Gracias.

¿Fue útil?

Solución 2

HWND es un identificador de una ventana.Este tipo se declara en WinDef.h de la siguiente manera:

typedef MANEJAR HWND;

HANDLE es un identificador de un objeto.Este tipo se declara en WinNT.h de la siguiente manera:

typedef MANGO PVOID;

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

typedef vacío *PVOID;

Entonces, HWND es en realidad un indicador de anulación.Puedes lanzar un long a un HWND como este:

HWND h = (HWND)my_long_var;

pero mucho cuidado con la información que se almacena en my_long_var.Debes asegurarte de tener un puntero allí.

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

Otros consejos

Siempre que esté seguro de que el LONG que tiene es realmente un HWND, entonces es tan simple como:

HWND hWnd = (HWND)(LONG_PTR)lParam;

Hacerlo sólo es seguro si no está ejecutando una versión de Windows de 64 bits.El tipo LONG es de 32 bits, pero el tipo HANDLE probablemente sea de 64 bits.Deberá dejar su código limpio en 64 bits.En resumen, querrás cambiar LONG a LONG_PTR.

Reglas para usar tipos de puntero:

No arroje punteros a Int, Long, Ulong o Dword.Si debe lanzar un puntero para probar algunos bits, establecer o borrar bits, o manipular su contenido, use el tipo UINT_PTR o INT_PTR.Estos tipos son tipos integrales que escalan al tamaño de un puntero para ventanas de 32 y 64 bits (por ejemplo, Ulong para ventanas de 32 bits y _int64 para ventanas de 64 bits).Por ejemplo, suponga que está portando el siguiente código:

ImageBase = (Pvoid) ((ulong) ImageBase | 1);

Como parte del proceso de portada, cambiaría el código de la siguiente manera:

ImageBase = (Pvoid) ((ulong_ptr) ImageBase | 1);

Use uint_ptr e int_ptr cuando sea apropiado (y si no está seguro de si son necesarios, no hay daño en usarlos por si acaso).No arroje sus consejos a los tipos de Ulong, Long, Int, Uint o Dword.

Tenga en cuenta que el mango se define como un vacío*, por lo que la preparación de un valor de mango a un valor de Ulong para probar, establecer o borrar los 2 bits de orden bajo es un error en las ventanas de 64 bits.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top