Premiers pas avec l'API Win32

Bonjour le monde

Les applications Microsoft Windows sont généralement écrites comme une application console ou une application fenêtrée (il existe d’autres types tels que les services et les plug-ins). La différence pour le programmeur est la différence d’interface pour le point d’entrée principal de la source d’application fournie par le programmeur.

Lorsqu’une application C ou C++ démarre, le point d’entrée de l’exécutable utilisé par le [chargeur exécutable][1] est le Runtime fourni par le compilateur. Le chargeur d’exécutable lit l’exécutable, effectue toute correction nécessaire à l’image, puis appelle le point d’entrée de l’exécutable qui, pour un programme C ou C++, est le Runtime fourni par le compilateur.

Le point d’entrée de l’exécutable invoqué par le chargeur n’est pas le point d’entrée principal fourni par le programmeur de l’application, mais plutôt le Runtime fourni par le compilateur et [l’éditeur de liens][2] qui crée l’exécutable. Le Runtime configure l’environnement de l’application puis appelle le point d’entrée principal fourni par le programmeur.

Une application console Windows peut avoir plusieurs interfaces légèrement différentes pour le point d’entrée principal fourni par le programmeur. La différence entre ceux-ci est de savoir si le point d’entrée principal est le traditionnel int main (int argc, char *argv[]) ou s’il s’agit de la version spécifique à Windows de int _tmain(int argc, _TCHAR* argv[]) qui prévoit des caractères larges dans les paramètres de l’application. Si vous générez un projet d’application de console Windows Win32 à l’aide de Visual Studio, la source générée sera la version spécifique de Windows.

Une application de fenêtre Windows (GUI) a une interface différente pour le point d’entrée principal fourni par le programmeur. Ce point d’entrée principal fourni par le programmeur a une interface plus complexe car le Runtime configure un environnement graphique et fournit des informations supplémentaires avec les paramètres de l’application.

Cet exemple explique l’interface du point d’entrée principal de la fenêtre Windows (GUI). Pour explorer ces sujets, vous devez avoir :

  • un IDE avec compilateur (de préférence Visual Studio) *Connaissance

Créez un projet de fenêtres Win32 vide (GUI, pas de console) à l’aide de l’IDE. Les paramètres du projet doivent être définis pour une application de fenêtre (et non une application de console) afin que l’éditeur de liens soit lié au bon Runtime. Créez un fichier main.c en l’ajoutant au projet, puis saisissez le code suivant :

#include <windows.h>

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

Ceci est notre programme Win32 “Hello, world”. La première étape consiste à inclure les fichiers d’en-tête Windows. L’en-tête principal pour tout Windows est windows.h, mais il y en a d’autres.

Le WinMain est différent d’un int main() standard utilisé avec une application console. Il y a plus de paramètres utilisés dans l’interface et, plus important encore, le point d’entrée principal d’une application de fenêtre utilise une convention d’appel différente de la norme C/C++.

Le qualificatif APIENTRY indique la convention d’appel, qui est l’ordre dans lequel les arguments sont poussés sur la pile. Par défaut, la convention d’appel est la convention C standard indiquée par __cdecl. Cependant, Microsoft utilise un autre type de convention d’appel, la convention PASCAL, pour les fonctions de l’API Windows, qui est indiquée par le qualificatif __stdcall. APIENTRY est un nom défini pour __stdcall dans l’un des fichiers d’en-tête inclus par windows.h (voir aussi [What is __stdcall?](http://stackoverflow.com/questions/297654/what-is- appel standard)).

Les prochains arguments de WinMain sont les suivants :

  • hInst : le descripteur d’instance
  • hInstPrev : le handle de l’instance précédente. Plus utilisé.
  • cmdline : arguments de ligne de commande (voir [Transmettre les arguments WinMain (ou wWinMain) à la main normale] (http://stackoverflow.com/questions/27363851/pass-winmain-or-wwinmain-arguments-to-normal-main))
  • cmdshow : indique si une fenêtre doit être affichée.

Nous n’utilisons encore aucun de ces arguments.

À l’intérieur de WinMain(), se trouve un appel à MessageBox(), qui affiche une boîte de dialogue simple avec un message, une boîte de message. Le premier argument est le handle de la fenêtre propriétaire. Comme nous n’avons pas encore notre propre fenêtre, passez NULL. Le deuxième argument est le corps du texte. Le troisième argument est la légende et le quatrième argument contient les drapeaux. Lorsque 0 est passé, une boîte de message par défaut s’affiche. Le diagramme ci-dessous dissèque la boîte de dialogue de la boîte de message.

[![entrez la description de l’image ici][3]][3]

Bons liens :

Sur les systèmes 32 bits uniquement. D’autres architectures ont des conventions d’appel différentes.

[1] : https://en.wikipedia.org/wiki/Loader_(informatique) [2] : https://en.wikipedia.org/wiki/Linker_(informatique) [3] : http://i.stack.imgur.com/U0n67.png