IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Portabilité et entry point.


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 96
    Points : 47
    Points
    47
    Par défaut Portabilité et entry point.
    Bonsoir,

    Je ne trouve pas de réponse à la question :
    Comment rendre le point d'entrée de mon framework portable entre main() et WinMain() sachant qu'il gère ensuite des éléments graphiques ? Je pense par exemple aux frameworks tel que Qt qui n'imposent pas d'utiliser WinMain() même dans une application graphique.

    J'ai bien quelques pistes, préprocesseur, réecriture de crt0.c.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    WinMain n'est pas standard, il est donc tout à fait normal que Qt n'impose pas l'utilisation de WinMain.

    Tu peux en effet utiliser le préprocesseur avec un #ifdefine #else #end.
    A vérifier mais il est aussi possible de spécifier le point d'entré du programme lors de la compilation alors est-ce qu'en spécifiant que c'est main ça marchera ?
    Sinon faire un WinMain qui appelle le main?

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Bonjour

    Qt n'a pas du tout besoin de WinMain, mais uniquement de main. Le même code compilera sans problème sous linux (donc sans win32) et sous windows avec plusieurs compilateur différents (avec win32 donc).

    Je suis pas spécialiste de win32, donc je vais spéculer un peu. je crois que WinMain est nécessaire uniquement lorsque l'on compile une application graphique win32, alors que Qt utilise une application "console". Mon avis est que lorsque l'on créé une application graphique win32, le compilateur va créé lui même la fonction main, en ajoutant l'initialisation de win32 puis en appelant la fonction WinMain. Le développeur n'a besoin de se préoccuper que de cette fonction donc. Pour Qt, l'initialisation de win32 doit se faire dans QApplication, qui est créé en général dans le main.

    En bref, faut utiliser que main et c'est au développeur du framework de se débrouiller avec win32 de façon transparente (faire une abstraction correcte)
    Regarde le code de Qt pour voir comment ils ont fait

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 96
    Points : 47
    Points
    47
    Par défaut
    Je pense effectivement que gbdivers a raison. L'initialisation se fait dans VC/crt/src/crt0.c avant d'appeler WinMain().
    Cependant je ne trouve aucune spécification de ces initialisations, ni sur msdn, ni sur google.
    Quelqu'un aurait une idée ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 96
    Points : 47
    Points
    47
    Par défaut
    Voici ce que j'ai découvert dans crt0.c :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    #ifdef _WINMAIN_
     
                lpszCommandLine = _twincmdln();
                mainret = _tWinMain( (HINSTANCE)&__ImageBase,
                                     NULL,
                                     lpszCommandLine,
                                     StartupInfo.dwFlags & STARTF_USESHOWWINDOW
                                          ? StartupInfo.wShowWindow
                                          : SW_SHOWDEFAULT
                                    );
    #else  /* _WINMAIN_ */
                _tinitenv = _tenviron;
                mainret = _tmain(__argc, _targv, _tenviron);
    #endif  /* _WINMAIN_ */
    Je pense qu'à l'exception de ce bloc l'initialisation est la même que _WINMAIN_ soit défini ou pas. Donc corrigez moi si j'ai tort, mais il doit être possible de faire fonctionner une application GUI win32 SANS passer par WinMain().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static HINSTANCE s_Instance; = static_cast<HINSTANCE>(GetModuleHandle(NULL));
    Pour récupérer le handle.

    Pour récupérer la ligne de commande.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Dans les options du projet, on peut carrément choisir le point d'entrée. Par contre, son prototype n'est ni celui de main(), ni celui de WinMain().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Ida Pro Entry point
    Par alito227 dans le forum Assembleur
    Réponses: 1
    Dernier message: 31/08/2006, 18h35
  2. Entry point d'un exe
    Par Moustico dans le forum C
    Réponses: 5
    Dernier message: 16/02/2006, 09h47
  3. Réponses: 17
    Dernier message: 28/07/2005, 08h20
  4. [State Event] Eléments Initial & Entry point
    Par Emerica dans le forum Autres Diagrammes
    Réponses: 2
    Dernier message: 12/11/2004, 14h50
  5. Réponses: 4
    Dernier message: 19/07/2004, 14h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo