Comment puis-je écrire une application Windows sans utiliser WinMain?
Question
applications Windows GUI écrites en C / C ++ ont 'WinMain' comme un point d'entrée (plutôt que 'principale'). Ma compréhension est que le compilateur génère une fonction « principale » d'être appelé par le C Runtime. Cette fonction « principale » met en place l'environnement nécessaire pour l'interface graphique et appelle en « WinMain » (en précisant l'instance gère etc.).
En bref, je crois que la console et le démarrage de l'application GUI diffèrent de la manière suivante:
application de la console: C Runtime -> fonction 'principale' (codée à la main)
application GUI: C Runtime -> fonction 'principale' (généré par le compilateur) -> fonction 'WinMain' (codée à la main)
Je voudrais à la fois de valider cette compréhension et de savoir comment je peux code à la main une interface graphique de Windows avec juste une fonction « principale » (à savoir sans avoir à écrire « WinMain »).
La solution
Vous avez une mauvaise compréhension. La différence entre principal et WinMain, outre un code d'initialisation de differet, ce sont les paramètres qui lui sont transmises.
principale ressemble à ceci:
int main(int argc, char* argv[]);
Alors que WinMain ressemble à ceci:
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
);
Quelque chose doit configurer ces paramètres et de faire l'appel, et qui est le code de démarrage. Lorsque vous compilez et liez un programme, l'un des paramètres de l'éditeur de liens est le point d'entrée, et qui sera, selon une application console ou GUI, un peu différent du code de démarrage.
Vous pouvez certainement écrire votre propre code de démarrage, allez dans votre visual c ++ répertoire source et vous pouvez trouver le code de démarrage, il est appelé crt0.c et il est dans le répertoire VC \ crt \ src.
Autres conseils
Avec juste principale, vous ne pouvez pas coder winmain. Pour les justifications, à la suite des déclarations ont été tirées de http://blogs.msdn.com/oldnewthing/archive/ 2007/12/03 / 6644060.aspx
[Dans la programmation Windows,] Pourquoi pas le point d'entrée de l'application appelée principale? Eh bien, pour une chose, le principal nom était déjà pris, et Windows n'a pas le pouvoir de réserver une autre définition. Il n'y avait pas de comité de normalisation du langage C à l'époque; C était ce que Dennis a dit qu'il était, et il était à peine garanti que Dennis prendrait des mesures spéciales pour préserver le code source de Windows la compatibilité dans une version future du langage C. Comme K & R ne précisait pas que les mises en œuvre pourraient étendre les formes acceptables de la fonction principale, il était tout à fait possible qu'il y ait un cadre juridique compilateur C qui a rejeté les programmes qui ont déclaré à tort principal. le norme linguistique actuelle de C permet explicitement la mise en œuvre spécifique d'autres définitions pour principal, mais exigeant que tous les compilateurs pour soutenir cette nouvelle version de Windows spécifique afin de compiler les programmes Windows serait à titre gratuit restreindre l'ensemble des compilateurs que vous pouvez utiliser pour l'écriture de programmes Windows.
Si vous avez réussi à surmonter cet obstacle, vous auriez le problème la version Windows de principal devrait être quelque chose comme ceci:
int main(int argc, char *argv[], HINSTANCE hinst, HINSTANCE hinstPrev, int nCmdShow);
En raison de la façon dont la liaison C a été effectuée, avaient toutes les variations d'une fonction d'accord sur la les paramètres qu'ils avaient en commun. Cela signifie que la version Windows il faudrait ajouter ses paramètres sur la fin de la plus longue existante version principale, et vous auriez à croiser les doigts et l'espoir que le langage C jamais ajouté une autre version alternative de principale. Si vous êtes allé dans cette voie, vos doigts croisés vous avez échoué, car il se qu'un troisième paramètre a été ajouté à principal quelque temps plus tard, et en conflit avec votre version de Windows convivial.
Supposons que vous avez réussi à convaincre Dennis de ne pas permettre que version à trois paramètres de principal. Il vous reste à venir avec les deux premiers paramètres, ce qui signifie que le code de démarrage de chaque programme doit contenir un analyseur de ligne de commande. De retour dans les jours 16 bits, les gens lésiné pour sauver chaque octet. en leur disant: « Oh, et tous vos les programmes vont être 2KB plus » ne serait probablement pas vous faire beaucoup d'amis. Je veux dire, c'est quatre secteurs d'E / S hors une disquette!
Mais sans doute la raison pour laquelle a été donné le point d'entrée Windows, une nom différent est de souligner que c'est une exécution différente environnement. Si elle était appelée principale, les gens prendraient des programmes C conçu pour un environnement de la console, les jeter dans leur de Windows compilateur, puis les exécuter, avec des résultats désastreux.
Espérons que cela efface vos doutes.
Il fonctionne dans l'autre sens. Il y a un fichier objet lié statiquement qui vient avec le compilateur qui tient le point d'entrée réelle. Ce point d'entrée ne initialisation et appelle votre point d'entrée (à savoir WinMain).
Qu'est-ce qu'une partie statique attend à appeler peut être tweakable. Par exemple, dans Visual Studio il y a un champ pour le nom du point d'entrée dans les paramètres de l'éditeur de liens.