Question

Cela fait partie d'une série d'au moins deux questions étroitement liées, mais distinctes. J'espère que je fais la bonne chose en leur demandant séparément.

Je suis en train d'obtenir mon Visual C ++ 2008 app pour travailler sans la bibliothèque C Runtime. Il est une application GUI Win32 sans MFC ou d'autres choses de fantaisie, tout simplement API Windows.

Je me suis donc Propriétés du projet -> Configuration -> C / C ++ -> Avancé -.> Omettre par défaut Bibliothèque noms à Oui (drapeau compilateur de /Zl) et reconstruit

Ensuite, l'éditeur de liens se plaint d'une _WinMainCRTStartup externe non résolu. Juste assez, je peux dire à l'éditeur de liens d'utiliser un point d'entrée différent, disons MyStartup. D'après ce que je comprends sur le web, _WinMainCRTStartup fait des trucs d'initialisation, et je veux probablement MyStartup faire un sous-ensemble de cela.

Alors ma question est: Quelles sont les fonctions _WinMainCRTStartup effectuer, et qui de ces puis-je omettre si je ne pas utiliser le CRT

Si vous êtes bien informé sur ce genre de choses, s'il vous plaît jeter un oeil à mon autre question aussi. Merci!

En plus: Pourquoi est-ce que je veux faire en premier lieu

?
  1. Mon application n'utilise pas explicitement des fonctions CRT.
  2. J'aime des applications simple et léger.
  3. Il va me enseigner quelque chose de nouveau.
Était-ce utile?

La solution

Le point d'entrée du CRT effectue les opérations suivantes (liste non exhaustive):

  • Initialise état global nécessaire par le CRT. Si cela ne se fait pas, vous ne pouvez pas utiliser toutes les fonctions ou l'état fournies par le CRT.
  • Initialise un état global qui est utilisé par le compilateur. contrôles d'exécution tels que le cookie de sécurité utilisé par / GS est définitivement ici. Vous pouvez appeler __security_init_cookie vous, cependant. Vous devrez peut-être ajouter un autre code pour d'autres contrôles d'exécution.
  • Appels constructeurs sur les objets C ++. Si vous écrivez du code C ++, vous devrez peut-être imiter cela.
  • Retrouve ligne de commande et le démarrage des informations fournies par le système d'exploitation et il passe votre principal. Par défaut, aucun paramètre sont transmis au point d'entrée du programme par le système d'exploitation - ils sont tous provied par le CRT
  • .

Le code source CRT est disponible avec Visual Studio et vous pouvez parcourir le point d'entrée du tube cathodique dans un débogueur et de savoir exactement ce qu'il fait.

Autres conseils

true programme Win32 écrit en C (non C ++) n'a pas besoin d'initialisation du tout, afin que vous puissiez commencer votre projet avec WinMainCRTStartup () au lieu de < strong> WinMain (HINSTANCE, ...) .

Il est également possible, mais un peu plus difficile d'écrire des programmes de la console comme de véritables applications Win32; le nom par défaut du point d'entrée est _mainCRTStartup () .

Désactiver toutes les fonctionnalités supplémentaires de génération de code comme sondes de la pile, les contrôles de tableau, etc. Debugging est encore possible.

Initialisation

Parfois, vous avez besoin du premier HINSTANCE paramètre . Pour Win32 (sauf Win32s), il est fixé à (HINSTANCE) 0x400000 .

nCmdShow paramètre est toujours SW_SHOWDEFAULT .

Si nécessaire, récupérer la ligne de commande avec GetCommandLine () .

Fin

Lorsque votre programme engendre des fils, par exemple en appelant GetOpenFileName () , retour de WinMainCRTStartup () retour mot-clé se bloque votre programme - utiliser ExitProcess () à la place.

Avertissements

Vous aurez des difficultés considérables lorsque:

  • en utilisant des trames de pile (à savoir, les variables locales) supérieure à 4 KBytes (par fonction)
  • en utilisant une arithmétique à virgule flottante (par exemple en fonction du flottant> conversion int)
  • en utilisant des nombres entiers de 64 bits sur des machines 32 bits (multiplication, les opérations de décalage de bit)
  • en C ++ nouveau , Supprimer , et les objets statiques avec des non-zéro-out-all-membres constructeurs
  • en utilisant les fonctions de la bibliothèque standard comme fopen () , printf () bien sûr

Dépanner

Il y a une bibliothèque standard C disponible sur tous les systèmes Windows (depuis Windows 95), MSVCRT.DLL .

Pour l'utiliser, importer leurs points d'entrée, par exemple en utilisant mon msvcrt-light.lib (google pour elle). Mais il y a encore des mises en garde, en particulier lors de l'utilisation de nouveaux compilateurs que MSVC6:

  • les cadres de pile sont encore limités à 4 kilo-octets
  • _ftol_sse ou _ftol2_sse doivent être acheminés à _ftol
  • _iob_func doivent être acheminés à _iob

L'initialisation semble fonctionner au moment du chargement. Au moins les fonctions de fichiers fonctionneront seemlessly.

question ancienne, mais les réponses sont incorrectes ou se concentrer sur un problème spécifique.

Il y a un certain nombre de C et C ++ fonctionnalités qui simplement ne seront pas disponibles sur Windows (ou les systèmes d'exploitation la plupart, d'ailleurs) si les programmes effectivement commencé à principal / WinMain.

Prenez cet exemple simple:

class my_class
{
public:
    my_class() { m_val = 5; }
    int my_func(){ return m_val }
private:
    int m_val;
}

my_class g_class;

int main(int argc, char **argv)
{
     return g_class.my_func();
}

pour que ce programme fonctionne comme prévu, le constructeur de my_class doit être appelée avant principale. Si le programme a commencé exactement au principal, il aurait besoin d'un hack compilateur (note: GCC fait cela dans certains cas) d'insérer un appel de fonction au début de la principale. Au lieu de cela, sur la plupart des systèmes d'exploitation et dans la plupart des cas, une fonction différente construit g_class puis appelle principal (sous Windows, c'est soit mainCRTStartup ou WinMainCRTStartup, sur la plupart des autres systèmes d'exploitation, je suis habitué est une fonction appelée _start)

Il y a d'autres choses C ++ et même C ont besoin d'être fait avant ou après principal pour travailler. Comment sont stdin et stdout (std :: cin et std :: Cout) utilisable dès les principaux départs? Comment le AtExit travail?

La norme C nécessite la bibliothèque standard ont une API de signal comme POSIX, qui sous Windows doit être "installé" avant principal ().

Sur la plupart des systèmes d'exploitation, il n'y a pas tas fourni par le système; le moteur d'exécution C implémente son propre tas (runtime C Microsoft enveloppe seulement les fonctions Kernel32 Heap).

Même les arguments transmis à principal, argc et argv doit être obtenu à partir du système en quelque sorte.

Vous pouvez jeter un oeil à des articles de Matt Pietrick (anciens) sur la mise en œuvre de son propre moteur d'exécution C pour plus de détails sur la façon dont cela fonctionne avec Windows + MSVC (note: MinGW et Cygwin mettre en œuvre des choses spécifiques différemment, mais en fait retomber à MSVCRT pour la plupart des choses): http://msdn.microsoft.com/en-us/library/bb985746.aspx

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