begin process at 2012 05 28 20:03:27
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Général

 > 

Définir un point d'entrée


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Définir un point d'entrée

dimanche 12 juillet 2009 à 15:22:12 | Définir un point d'entrée

Havy

Bonjour, sachant que tout programme console doit contenir la fonction main pour fonctionner, car c'est le point d'entrée, je voudrais savoir s'il est possible de définir son propre point d'entrée.

Par exemple je voudrais faire ceci :

#include <iostream>

using namespace std;

void Test()
{
}

Et donc, faire en sorte que quand je compile, il n'y'a pas référence à main mais à Test comme fonction principale pour faire démarrer le programme.

J'ai fais des recherches concernant la directive #pragma et entry, mais je n'ai rien trouvé qui pourrait m'aider.

NB : J'utilise Dev-C++ si cela peut aider :)

Merci d'avance pour votre aide, passez une bonne journée et bonne prog ;)
dimanche 12 juillet 2009 à 17:22:09 | Re : Définir un point d'entrée

juju12

oui.

Sous Visual C++ Express (mais je pense que ça t'aidera pas)

#pragma comment(linker,"/entry:Test")


du moins, tu sais que c'est possible maintenant.
samedi 18 juillet 2009 à 22:52:47 | Re : Définir un point d'entrée

rt15

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !

Salut,

Alors en fait, dans un fichier .exe, il y a un point d'entrée "entry point". C'est une adresse définie dans le header du fichier exécutable, au milieu d'autres infos :

Code :
OPTIONAL HEADER VALUES

10B magic #
8.00 linker version
12E00 size of code
18800 size of initialized data
0 size of uninitialized data
126FE address of entry point
1000 base of code


Quand on demande à Windows d'exécuter un programme, il charge en mémoire le contenu du .exe, en mappant les sections de celui-ci à divers emplacement, en se basant sur les infos dans le header. Puis il charge les dll nécessaires (Précisées dans une table elle aussi accessible via le header), et résous les adresses des fonctions importées. Il appelle aussi les point d'entrée de ces dlls.

Et finalement, le programme démarre "réellement" quand le point d'entrée du .exe est appelé.

Mais quel code ce trouve ici ? Le code du main compilé ? NON !
Il y a le code d'initialisation de la runtime, qu'elle soit C ou C++.

En effet, pour pouvoir fonctionner, la CRT a besoin d'une phase d'initialisation, et d'une phase de libération, avant et après le main. C'est là que va d'ailleurs se faire la préparation de argv et argc, qui ne sont pas passé en argument du vrai point d'entrée (Il n'a pas d'arguments pour un .exe).

La CRT est une librairie comme une autre (Dans le cas de gcc, il s'agit de la glibc), qui fournit toutes les fonctions de base du standard C (printf, fopen, system, malloc, strcat...), sauf qu'elle est dans le chemin du lieur par défaut (-lC par défaut quoi). Pour le C++, le principe doit être similaire. Le C++ est forcé d'exécuter du code caché lui aussi, en plus de celui du C (Des exécution de constructeurs notamment).

Mais la particularité de cette librairie, donc, c'est qu'elle appelle le main. Au vrai point d'entrée du .exe, ont trouve quelques chose comme ça (C'est pas du tout comme ça mais c'est l'esprit, dans le cas d'une appli console) :

Code C/C++ :

/* Déclaration du main */
int main(int argc, char** argv);

int __cdecl WinMainCRTStartup()
{
int nResult;
InitCrt();
nResult = main(GetArgC(), GetArgV());
FreeCrt();
return nResult;
}


Comment le linker sait-il quelle adresse mettre comme entry point dans le header ? Il met l'adresse de WinMainCRTStartup (Appli gui) ou de mainCRTStartup (Appli console). C'est codé en dur dans le linker ! La CRT définie ces deux symboles donc quoiqu'il arrive, ils sont trouvés au link.

Par contre quand on oublie de définir un main, pouf, le linker n'est pas content, car il ne trouve pas l'implémentation de la fonction main appelée par le code d'initialisation de la CRT (WinMain dans le cas d'une appli GUI).

Première constatation... Si on veut définir son propre point d'entrée, la CRT n'est pas initialisée ! Bilan, définir son propre point d'entrée, s'est aller au devant de très gros ennui si on utilise des fonctions standard... Par contre, avec windows.h par exemple, pas de soucis !

Bon, donc supposons que l'on décide de ne pas utiliser la lib standard...

Il faut donc, par exemple pour une appli GUI, se débarrasser de la CRT en entrée du lieur, et définir WinMainCRTStartup (Méthode qui marche pour VC et gcc donc plus portable que le /entry). Exemple de code :
Code C/C++ :
#include "windows.h"


int __cdecl WinMainCRTStartup()
{
MessageBox(NULL, "Je n'ai pas de CRT", "Point d'entrée custom", MB_OK);
return 0;
}


Ce code n'inclus que windows.h, donc on ne touche pas à la CRT.

Pour compiler, on demande à gcc de ne pas utiliser les libs par défaut :
-nostartfiles -nodefaultlibs -nostdlib pour gcc
/NODEFAULTLIB pour VC

Par contre faut ajouter manuellement d'éventuelles librairies par défaut manquante du coup (Ici, MessageBox est dans user32) ->
gcc -Wall -ansi -pedantic test.c -o test.exe -nostartfiles -nodefaultlibs -nostdlib -luser32

Et nous voilà avec un superbe .exe de 5ko, sans initialisation et libérations inutile... Bref une bête de course très propre.


lundi 20 juillet 2009 à 19:39:14 | Re : Définir un point d'entrée

Havy

Je vous remercie beaucoup pour toutes ces infos, je vais travailler sur tout ça :)

Encore merci et passez une bonne journée ;)



Cette discussion est classée dans : fonction, programme, définir, main, entrée


Répondre à ce message

Sujets en rapport avec ce message

Communication interprocessus [ par infodaoudi ] Bonjour, j'ai un programme (et non pas une fonction) qui doit retourner plusieurs paramètres (15 de types différent) , ces paramètres devront être com problème de compilation [ par boualiasma ] Bonjour, J'ai un programme codé en c sous Microsoft Visual C++ 6.0 qui compile et s'éxecute bien. J'ai essayé de compiler ce programme avec Dev-C++ PVM et Thread [ par Vincentsoft ] Salut, Voila, j'ai un probleme avec les thread et PVM. Voila, j'ai un programme qui va lancer deux autres programme (le meme mais sur une autre machi programme curseur [ par bassemamara1984 ] bonjour dans mon programme je veut afficher des image alors j'ai charger 4 image pour faire apparaitre un carré sur mon programme vous saver que pour Problèmes avec les arguments d'entrés d'une fonction [ par farah19 ] Salut, J'ai créé un main qui a géneré un exécutable, ce main prend en entré 2 arguments. En l'exécutant de la console avec les ligne de commandes: a Fonction While multiple [ par oshin ] Salut tout le monde,J'ai un problème tout bête..Dans mon programme j'ai inclus une fonction "While(1)" donc infini.. le probleme c'est que lorsque le j'applique ce programme mé ca fonction pa le problemes et tjrs au niveau de getch(); me donne erreur????????? [ par perledumaroc ] #include#includeint main(){    int x;    printf("entrer la valeur de x");    scanf("%d", & x);     x+=21;    printf("la valeur de x=%d",x);    getch fonction dans dll qui fait planter programme [ par pitch069 ] Bonjour,je travail actuellement sur un code C++, sous dev c++. j'utilise une dll au travers d'un *.lib et dans mon programme principal je fais appel a controller l'execution d'une fonction [ par ebrainis ] Salut, je programme un interface graphique qui permette à un utilisateur de controler l'execution d'une fonction. Comme je suis débutant, j'ai trouvé


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,014 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales