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 »).

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top