varias - windows programming
¿Cuál es el rango de un MANGO de Windows en una aplicación de 64 bits? (2)
En WinAPI, el tipo HANDLE
se define como un void*
, por lo tanto, en una aplicación de 64 bits, el valor HANDLE
puede variar de 0
a 18446744073709551615
. ¿Pero es eso cierto en la práctica? ¿Alguna documentación especifica el rango integral de tal HANDLE
?
Si, por ejemplo, uno desea almacenar este HANDLE
como un int32_t
en una aplicación de 32 bits, está completamente bien, pero en una aplicación de 64 bits las dudas se mantienen.
Estados de MSDN:
Las versiones de Windows de 64 bits utilizan controladores de 32 bits para la interoperabilidad. Cuando se comparte un identificador entre aplicaciones de 32 y 64 bits, solo los 32 bits más bajos son significativos, por lo que es seguro truncar el identificador (cuando se pasa de 64 bits a 32 bits) o extender el identificador ( cuando se pasa de 32 bits a 64 bits). Los identificadores que se pueden compartir incluyen identificadores para objetos de usuario como ventanas (HWND), identificadores para objetos GDI como rotuladores y pinceles (HBRUSH y HPEN), y identificadores para objetos con nombre, mutexes, semáforos y identificadores de archivos.
También vale la pena señalar este comentario añadido en esa página:
La forma correcta de compartir dichos manejadores a través de los límites del proceso es mediante la extensión a cero de 32 bits a 64 bits, o viceversa al truncar los 64 bits a 32 bits, descartando los bits superiores.
Tenga en cuenta la distinción entre un "tirador de signo" y un "tirador de cero".
Edición: a juzgar por la discusión vista en una respuesta eliminada a esta pregunta, supongo que la importancia de extender el signo de un identificador de 32 bits para llegar a un identificador de 64 bits en lugar de extenderlo a cero es retener el tratamiento adecuado de INVALID_HANDLE_VALUE Valor para un mango.
https://msdn.microsoft.com/en-us/library/windows/desktop/aa384203%28v=vs.85%29.aspx
Quisiera saber dónde está documentado, pero un colega mío insiste en que los manejadores de HWND de 64 bits siempre encajan en 32 bits. Nunca he visto un caso en el que no sea cierto, pero no puedo hablar sobre el futuro o dónde está documentado. Con respecto a otros manejadores como, por ejemplo, HTREEITEM ... Son de 64 bits completos y se me ha dado por supuesto que también caben en 32 bits.