Primeros pasos con la API de Win32

Hola Mundo

Las aplicaciones de Microsoft Windows generalmente se escriben como una aplicación de consola o una aplicación de ventana (hay otros tipos, como servicios y complementos). La diferencia para el programador es la diferencia en la interfaz del punto de entrada principal para la fuente de la aplicación proporcionada por el programador.

Cuando se inicia una aplicación C o C++, el punto de entrada del ejecutable utilizado por el cargador de ejecutables es el tiempo de ejecución proporcionado por el compilador. El cargador de ejecutables lee el ejecutable, realiza las correcciones necesarias en la imagen y luego invoca el punto de entrada del ejecutable que, para un programa C o C++, es el tiempo de ejecución proporcionado por el compilador.

El punto de entrada del ejecutable invocado por el cargador no es el punto de entrada principal proporcionado por el programador de la aplicación, sino el tiempo de ejecución proporcionado por el compilador y el enlazador que crea el ejecutable. Runtime configura el entorno para la aplicación y luego llama al punto de entrada principal proporcionado por el programador.

Una aplicación de consola de Windows puede tener varias interfaces ligeramente diferentes para el punto de entrada principal proporcionado por el programador. La diferencia entre estos es si el punto de entrada principal es el tradicional int main (int argc, char *argv[]) o si es la versión específica de Windows de int _tmain(int argc, _TCHAR* argv[]) que proporciona caracteres anchos en los parámetros de la aplicación. Si genera un proyecto de aplicación de consola Windows Win32 con Visual Studio, la fuente generada será la versión específica de Windows.

Una aplicación de ventana de Windows (GUI) tiene una interfaz diferente para el punto de entrada principal proporcionada por el programador. Este punto de entrada principal proporcionado por el programador tiene una interfaz más compleja porque Runtime configura un entorno GUI y proporciona información adicional junto con los parámetros de la aplicación.

Este ejemplo explica la interfaz del punto de entrada principal de la ventana de Windows (GUI). Para explorar estos temas, debe tener:

  • un IDE con compilador (preferiblemente Visual Studio)
  • conocimiento C

Cree un proyecto de Windows Win32 vacío (GUI, no consola) utilizando el IDE. La configuración del proyecto debe establecerse para una aplicación de ventana (no una aplicación de consola) para que el enlazador se vincule con el tiempo de ejecución correcto. Cree un archivo main.c agregándolo al proyecto y luego escriba el siguiente código:

#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow)
{
    return MessageBox(NULL, "hello, world", "caption", 0);
}

Este es nuestro programa Win32 “Hello, world”. El primer paso es incluir los archivos de encabezado de Windows. El encabezado principal de todo Windows es windows.h, pero hay otros.

WinMain es diferente de int main() estándar usado con una aplicación de consola. Se utilizan más parámetros en la interfaz y, lo que es más importante, el punto de entrada principal para una aplicación de ventana utiliza una convención de llamada diferente del C/C++ estándar.

El calificador APIENTRY indica la convención de llamada, que es el orden en el que se insertan los argumentos en la pila. De forma predeterminada, la convención de llamada es la convención estándar de C indicada por __cdecl. Sin embargo, Microsoft utiliza un tipo diferente de convención de llamadas, la convención PASCAL, para las funciones de la API de Windows, que se indica mediante el calificador __stdcall. APIENTRY es un nombre definido para __stdcall en uno de los archivos de encabezado incluidos por windows.h (ver también [¿Qué es __stdcall?](http://stackoverflow.com/questions/297654/what-is- llamada estándar)).

Los siguientes argumentos para WinMain son los siguientes:

Todavía no usamos ninguno de estos argumentos.

Dentro de WinMain(), hay una llamada a MessageBox(), que muestra un diálogo simple con un mensaje, un cuadro de mensaje. El primer argumento es el identificador de la ventana del propietario. Como aún no tenemos nuestra propia ventana, pase NULL. El segundo argumento es el cuerpo del texto. El tercer argumento es el título y el cuarto argumento contiene las banderas. Cuando se pasa 0, se muestra un cuadro de mensaje predeterminado. El siguiente diagrama disecciona el cuadro de diálogo del mensaje.

ingrese la descripción de la imagen aquí

Buenos enlaces:

Solo en sistemas de 32 bits. Otras arquitecturas tienen diferentes convenciones de llamadas.