2011-09-17 5 views
7

Como soy un principiante, puede ser una pregunta muy básica. Estoy comenzando DirectX 11, y mientras creaba mi primera aplicación, se usó wWinMain, y mientras buscaba la diferencia entre WinMain y wWinnain, encontré este parámetro prevInstance.Por qué existe prevInstance en WinMain y wWinMain si siempre es NULO

prevInstance siempre es nulo según MSDN, y como siempre es nulo, ¿por qué existe? (Ya que es lógico pensar que los creadores no hayan dado un parámetro inútil). Y (citando el libro),

si necesita una manera de determinar si una instancia anterior de la aplicación ya se está ejecutando, la documentación recomienda crear un mutex con nombre único usando CreateMutex. Aunque el mutex será creado, la función CreateMutex devolverá ERROR_ALREADY_EXISTS.

¿Qué es un mutex y cómo usarlo? (Un buen enlace será suficiente). Y parece que se necesita un método para encontrar si existe otra instancia de una aplicación, prevInstance debería tener un puntero o una referencia a él, que aparentemente no es el caso, ya que es nulo. ¿Por qué es así y cuál es el rol de prevInstance?

+4

El hecho de que * sea * siempre nulo no significa que * fue * siempre nulo ... – quasiverse

Respuesta

15

Raymond Chen's blog está casi completamente dedicado a discutir aspectos de la API de Windows que son "rarezas" para nosotros hoy en día. Y afortunadamente, tiene un blog post que responde esta pregunta exacta:

En Windows de 16 bits había una función llamada GetInstanceData. Esta función tomó un HINSTANCE, un puntero y una longitud, y copió la memoria de esa instancia en su instancia actual. (Es una especie de la 16 bits equivalente a ReadProcessMemory, con la restricción de que los parámetros segundo y tercer tenían que ser la misma.)

...

Esta fue la razón para el parámetro a hPrevInstance WinMain. Si hPrevInstance no era NULL, entonces era el identificador de instancia de una copia del programa que ya se está ejecutando. Puede utilizar GetInstanceData para copiar datos desde allí, levantarse más rápido del suelo. Por ejemplo, , es posible que desee copiar el controlador de ventana principal de la instancia anterior para que pueda comunicarse con él.

Si hPrevInstance era NULL o no le informaron si era la primera copia del programa de . En Windows de 16 bits, solo la primera instancia de un programa registró sus clases; la segunda y posteriores instancias continuaron utilizando las clases que se registraron en la primera instancia de . (De hecho, si lo intentaron, el registro fallaría ya que la clase ya existía.) Por lo tanto, todos los programas de Windows de 16 bits omitieron el registro de clase si hPrevInstance era no NULL.

Las personas que diseñaron Win32 se encontraron en una situación difícil cuando llegó la hora de portar WinMain: ¿Qué pasar para hPrevInstance? El cosa de módulo/instancia no existía en Win32, después de todo, y espacios de direcciones separados significaba que los programas que saltearan la reinicialización en la segunda instancia ya no funcionarían.Entonces Win32 siempre pasa NULL, lo que hace que todos los programas crean que son el primero en .

Por supuesto, ahora que hPrevInstance es irrelevante para la API de Windows hoy en día, excepto por razones de compatibilidad, MSDN recomienda el uso de un mutex para detectar casos anteriores de una aplicación.

Un mutex significa "exclusión mutua". Puede consultar the MSDN documentation para CreateMutex(). Hay muchos ejemplos de uso de mutexes para detectar instancias previas de aplicaciones, such as this one. La idea básica es crear un mutex con un nombre único que se te ocurra, luego intenta crear ese mutex con nombre. Si CreateMutex() falló con ERROR_ALREADY_EXISTS, sabrá que ya se inició una instancia de su aplicación.

+4

Me tomé la libertad de resumir la publicación del blog para que tu respuesta fuera más que un simple enlace. –

+0

@Jon Purdy: Agradezco la edición, pero ya estaba en el medio de citar toda la explicación del Sr. Chen para no perder el contexto. :-) –

+2

Está bien que todo termine bien, supongo. Tal vez SO debería tener un indicador para las respuestas que están siendo editadas actualmente. –

1

El parámetro de la instancia prev está disponible para la compatibilidad de Windows de 16 bits. Creo que eso fue declarado en la referencia de MSDN para WinMain, al menos lo que solía ser.

Cuestiones relacionadas