2009-11-30 15 views
18

MSDN me dice que los identificadores de ventanas (HWND) se pueden compartir entre las aplicaciones de 32 y 64 bits, en Interprocess Communication (MSDN). Sin embargo, en Win32, un HWND es de 32 bits, mientras que en Windows de 64 bits es de 64 bits. Entonces, ¿cómo se pueden compartir los mangos?¿Cómo puedo compartir HWND entre aplicaciones de 32 y 64 bits en Win x64?

Supongo que la misma pregunta se aplica a los identificadores de objetos con nombre como mutexes, semáforos y manejadores de archivos.

Respuesta

6

¿El hecho de que no se puedan compartir implica que solo los 32 bits inferiores se utilizan en los procesos de Win64? Los identificadores de Windows son índices, no punteros, al menos hasta donde puedo decir, a menos que MS quiera permitir más de 2^32 ventanas/archivos/mutex/etc. maneja que no hay razón para usar los 32 bits altos de void* en Win64.

+7

Veo la implicación, pero parece que no hay documentación específica en MSDN que indique que solo se utilizan los 32 bits inferiores y que se usarán alguna vez, por lo que es seguro hacerlo. El conocimiento de la implementación subyacente actual de los identificadores de ventanas no es una garantía de que esto no cambie en futuras versiones de Windows, dado que esto no está documentado. –

+1

Si hay una cosa a la que MS es bueno, es mantener la compatibilidad con versiones anteriores. Estoy de acuerdo en que sería bueno encontrar alguna declaración explícita sobre el tema, pero parece que una declaración implícita es lo único que obtendrás. Tal vez deberías preguntar en uno de los foros como 'microsoft.public.windows.64bit.general' o' microsoft.public.windows.app_compatibility' (Ver http://www.aumha.org/nntp.php) Algunos desarrolladores de MS debe saber con certeza ... –

+1

@Marc: la "documentación específica en MSDN" es la misma declaración a la que se ha vinculado. Realmente no dice que solo se usan los 32 bits más bajos, y de hecho esperaría que Win64 establezca al menos un bit alto, solo para descubrir los identificadores que se han truncado, pero los 32 bits más bajos deberían ser suficientes para ser únicos. identifica una ventana. – MSalters

1

Creo que tiene razón en ser cauteloso en general. Sin embargo, MSDN afirmando que pueden ser compartidos es un contrato para nosotros los programadores. No pueden decir "compártelo hoy" y "ya no" mañana, sin romper una gran cantidad de software.

De manera similar, para que los softwares x64 y 32bit se ejecuten simultáneamente en una máquina determinada, y para que todos puedan llevarse bien, los HWND (y muchos MANIPULADORES) deben seguir siendo de 32 bits y compatibles.

Creo que lo que estoy diciendo es que creo que esta es una apuesta muy segura, al menos durante la vida útil de Windows 7, y probablemente Windows "siguiente".

11

Acabo de recibir un correo electrónico de un desarrollador de Microsoft WOW64 que confirma:

Los mangos son de 32 bits y pueden ser de forma segura truncada/extendido cero. Es cierto tanto para los identificadores de objetos del kernel como para los identificadores USER/GDI.

2

Tener una mirada en Microsoft Interface Definition Language (MIDL) Guía de portabilidad, página 12 (http://msdn.microsoft.com/en-us/library/ms810720.aspx)

Aquí un vistazo manijas USUARIO ar y GDI se extienden signo valora 32b

16

Como se señala anteriormente Daniel Rose, la MSDN documentation ahora afirma:

... que es seguro para truncar el mango (cuando pasándolo de 64 bits a 32 bits) o extender la manecilla (al pasarlo de 32 bits a 64-bi t).

Todavía parece haber algo de confusión aquí, dado que me dijeron que la extensión cero es la correcta para un desarrollador WOW64. Si está escribiendo un módulo de 64 bits que obtiene identificadores de módulos de 32 bits, la apuesta más segura podría ser comparar solo los 32 bits inferiores del controlador (es decir, truncar). De lo contrario, puede quedar atrapado en una extensión de signo vs diferencia de extensión cero.

Cuestiones relacionadas