Point d’entrée de l’application WinMain

Chaque programme Windows inclut une fonction de point d’entrée nommée WinMain ou wWinMain. Le code suivant montre la signature pour wWinMain :

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

Les quatre paramètres wWinMain sont les suivants :

  • hInstance est le handle d’une instance ou d’un module. Le système d’exploitation utilise cette valeur pour identifier l’exécutable ou EXE lorsqu’il est chargé en mémoire. Certaines fonctions Windows ont besoin du handle d’instance, par exemple pour charger des icônes ou des bitmaps.
  • hPrevInstance n’a aucune signification. Il a été utilisé dans Windows 16 bits, mais est désormais toujours égal à zéro.
  • pCmdLine contient les arguments de ligne de commande sous forme de chaîne Unicode.
  • nCmdShow est un indicateur qui indique si la fenêtre d’application principale est réduite, agrandie ou affichée normalement.

La fonction retourne une int valeur. Le système d’exploitation n’utilise pas la valeur de retour, mais vous pouvez utiliser la valeur pour passer un code d’état à un autre programme.

Une convention d’appel, telle que WINAPI, définit la façon dont une fonction reçoit les paramètres de l’appelant. Par exemple, la convention d’appel définit l’ordre dans lequel les paramètres apparaissent sur la pile. Veillez à déclarer votre fonction wWinMain comme indiqué dans l’exemple précédent.

La fonction WinMain est identique à wWinMain, sauf que les arguments de ligne de commande sont passés sous forme de chaîne ANSI. La chaîne Unicode est recommandée. Vous pouvez utiliser la fonction ANSI WinMain même si vous compilez votre programme au format Unicode. Pour obtenir une copie Unicode des arguments de ligne de commande, appelez la fonction GetCommandLine . Cette fonction retourne tous les arguments d’une chaîne unique. Si vous souhaitez que les arguments soient un tableau de style argv, transmettez cette chaîne à CommandLineToArgvW.

Comment le compilateur sait-il appeler wWinMain au lieu de la fonction principale standard ? En fait, la bibliothèque d’exécution C Microsoft (CRT) fournit une implémentation de main qui appelle WinMain ou wWinMain.

Le CRT fait un peu plus de travail à l’intérieur de main. Par exemple, il appelle tous les initialiseurs statiques avant wWinMain. Bien que vous puissiez indiquer à l’éditeur de liens d’utiliser une autre fonction de point d’entrée, vous devez utiliser la valeur par défaut si vous créez un lien vers le CRT. Sinon, le code d’initialisation CRT est ignoré, avec des résultats imprévisibles tels que des objets globaux non initialisés correctement.

Le code suivant montre une fonction WinMain vide :

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

Maintenant que vous disposez du point d’entrée et que vous comprenez certaines des conventions de codage et de terminologie de base, vous êtes prêt à créer votre premier programme Windows.