Compartir a través de


Punto de entrada de la aplicación WinMain

Cada programa de Windows incluye una función de punto de entrada denominada WinMain o wWinMain. En el código siguiente se muestra la firma de wWinMain:

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);

Los cuatro parámetros wWinMain son los siguientes:

  • hInstance es el identificador de una instancia o identificador de un módulo. El sistema operativo usa este valor para identificar el ejecutable o EXE cuando se carga en la memoria. Algunas funciones de Windows necesitan el identificador de instancia, por ejemplo, para cargar iconos o mapas de bits.
  • hPrevInstance no tiene significado. Se usó en Windows de 16 bits, pero ahora siempre es cero.
  • pCmdLine contiene los argumentos de la línea de comandos como una cadena Unicode.
  • nCmdShow es una marca que indica si la ventana principal de la aplicación está minimizada, maximizada o mostrada normalmente.

La función devuelve un int valor. El sistema operativo no usa el valor devuelto, pero puede usar el valor para pasar un código de estado a otro programa.

Una convención de llamada, como WINAPI, define cómo una función recibe parámetros del autor de la llamada. Por ejemplo, la convención de llamada define el orden en que aparecen los parámetros en la pila. Asegúrese de declarar la función wWinMain como se muestra en el ejemplo anterior.

La función WinMain es la misma que wWinMain, excepto que los argumentos de la línea de comandos se pasan como una cadena ANSI. Se prefiere la cadena Unicode. Puede usar la función WinMain ANSI incluso si compila el programa como Unicode. Para obtener una copia Unicode de los argumentos de la línea de comandos, llame a la función GetCommandLine . Esta función devuelve todos los argumentos de una sola cadena. Si desea que los argumentos sean una matriz de estilo argv, pase esta cadena a CommandLineToArgvW.

¿Cómo sabe el compilador invocar wWinMain en lugar de la función principal estándar? Lo que sucede realmente es que la biblioteca en tiempo de ejecución de Microsoft C (CRT) proporciona una implementación de main que llama a WinMain o wWinMain.

El CRT hace algo más de trabajo dentro de main. Por ejemplo, llama a los inicializadores estáticos antes de wWinMain. Aunque puede indicar al enlazador que use una función de punto de entrada diferente, debe usar el valor predeterminado si se vincula a CRT. De lo contrario, se omite el código de inicialización de CRT, con resultados imprevisibles, como los objetos globales que no se inicializan correctamente.

El código siguiente muestra una función WinMain vacía:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR lpCmdLine, int nCmdShow)
{
    return 0;
}

Ahora que tiene el punto de entrada y comprende algunas de las convenciones básicas de terminología y codificación, está listo para crear su primer programa de Windows.