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

Windows Discussion :

Applis graphiques et mode console


Sujet :

Windows

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Points : 27
    Points
    27
    Par défaut Applis graphiques et mode console
    Bonjour,

    Je développe des applis graphiques mais j'aimerais pouvoir aussi les utiliser en mode console. Plus exactement je voudrais que lorsque on lance l'appli avec un switch depuis une console, le programme retourne une valeur comme peut le faire la commande DIR ou TIME en msdos.

    Je développe avec MinGw et Qt et je ne connais rien en API windows (il y a une semaine que j'ai découvers les handle, hwin etc....)

    J'y suis presque, voilà comment je m'y prends :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    //En-tête pour Qt
    #include <QApplication>
    #include <QFont>
    #include <QPushButton>
    #include <QDebug>
    
    #if (_WIN32_WINNT < 0x0500) // This switch is needed to make the program compile
    #undef _WIN32_WINNT        // because AttachConsole needs it. See Documentation
    #define _WIN32_WINNT 0x0501 // for AttachConsole in MSDN.
    #endif
    
    #include <windows.h>
    #include <cstdio>
    #include <iostream>
    
    HANDLE hOutput;
    
    int consoleCnx(void)
        {
        static LPCTSTR ConsoleClassName = TEXT( "ConsoleWindowClass" );
        static LPCTSTR ConsoleTitle = TEXT( "Invite de commandes" );
    
        // trouver la fenêtre console à partir du titre donné
        HWND hConsoleWnd = ::FindWindow(
            ConsoleClassName,
            ConsoleTitle );
    
        if(hConsoleWnd == NULL) return 1;
    
        // récupérer le processus associé à cette fenêtre
        DWORD pid;
        if (!::GetWindowThreadProcessId(hConsoleWnd,&pid)) return 2;
    
        // s'attacher à la console de ce processus
        if(!::AttachConsole(pid)) return 3;
    
        // si une console est rattachée au processus, alors il existe des fichiers
        // virtuel CONIN$ et CONOUT$ qui permettent respectivement de lire
        // et d'écrire depuis / dans cette console (voir la doc de CreateFile).
    #if _MSC_VER >= 1400 // VC++ 8
        // éviter le warning C4996: 'freopen' was declared deprecated
        // This function or variable may be unsafe. Consider using freopen_s instead.
        FILE *stream;
        freopen_s( &stream, "CONIN$", "r", stdin );
        freopen_s( &stream, "CONOUT$", "w", stdout );
        freopen_s( &stream, "CONOUT$", "w", stderr );
    #else
        std::freopen( "CONIN$", "r", stdin );
        std::freopen( "CONOUT$", "w", stdout );
        std::freopen( "CONOUT$", "w", stderr );
    #endif
    
        // la ligne suivante synchronise les flux standards C++ (cin, cout, cerr...)
        std::ios_base::sync_with_stdio();
    
        // récupérer un handle sur la sortie console
        hOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
        if (hOutput == INVALID_HANDLE_VALUE){
            ::FreeConsole();
            return 4;
            }
    
        return 0;
        }
    
    int main(int argc, char* argv[])
        {
        #ifndef DEBUG
        consoleCnx();
        #endif
    
        if (argc > 1)
            if (QString(argv[1]) == QString("-v")){
    
                std::cout << "cout \n";
    
                DWORD *wrote = 0;
                WriteFile(hOutput,"WriteFile \n",11,wrote,NULL);
    
                unsigned long ulWritten;
                WriteConsole(hOutput,TEXT("WriteConsole \n"),14,&ulWritten,NULL);
    
                return 0;
                }
    
        //Code Qt pour afficher un bouton
        QApplication app(argc, argv);
    
        QPushButton quit("Quit");
        quit.resize(75, 30);
        quit.setFont(QFont("Times", 18, QFont::Bold));
        QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit()));
        quit.show();
    
        return app.exec();
        }
    Seulement voilà ce que ce code retourne exactement:

    *********
    c:\repertoire>winConsole.exe -v

    c:\repertoire>cout
    WriteFile
    WriteConsole

    ***********

    En plus, il faut que je tape entrée pour récupérer la main. D'autre part, si je fais :

    c:\repertoire>winConsole.exe -v > test.txt

    Le fichier test.txt est vide

    Ce n'est pas le fonctionnement des commandes classiques comme par exemple TIME /T
    Le résultat est affiché sous le prompt, je récupère automatiquement la main et je peux rediriger la sortie vers un fichier texte.

    Un autre problème de mon code, c'est que j'utilise le nom de la fenêtre de la console "Invite de commande" mais ce n'est pas très propre, surtout qu'on a des machines en français et en anglais et il peut y avoir d'autre consoles d'ouvertes en même temps. Est ce qu'on peut récupérer le HWND ou le pid de la fenetre appelante?

    Je veux faire ça car je dépose sur un disque réseau les programmes que je développe et les utilisateurs les récupères depuis différentes machines. Seulement ils n'ont pas toujours le réflexe de vérifier les mises à jour et je voudrais faire un script qui compare la version du programme locale avec celle du disque réseau et qui download automatiquement la dernière version si nécessaire.

    Voilà j'espère que je ne vous ai pas trop saoulé mais je ne vois plus trop quoi faire malgré ce lien :

    http://www.developpez.net/forums/d85...-infos-stdout/

  2. #2
    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
    Franchement, je pense que le mieux est de faire un programme séparé pour la version console.
    http://blogs.msdn.com/oldnewthing/ar...1/9259142.aspx
    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.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Points : 27
    Points
    27
    Par défaut
    Pourquoi pas, mais comment récupérer le numéro de version contenu dans le programme graphique?

  4. #4
    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
    Si le n° de version est stocké sous forme de ressource VERSION, tu peux l'avoir avec les fonctions associées.
    Mais il me semble que c'est assez compliqué à utiliser...
    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.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Points : 27
    Points
    27
    Par défaut
    Cette ressource version, c'est celle que l'on peut voir dans l'explorateur windows ou via le clique-droit-propriétés ?

    Si c'est le cas, c'est précisément ce que je voulais éviter car je ne connais pas la prg windows.

    Par contre il me vient une idée : je pourrai utiliser le code de retour du main et passer le num de version comme un code d'erreur

  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
    Tu pourrais, mais tu es limité par le standard.

    Ou bien, si tu n'as pas peur de voir une console clignoter à l'écran, tu utilises la solution ildasm: Programme console + FreeConsole() s'il n'y a pas de paramètre en ligne de commande.
    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.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Points : 27
    Points
    27
    Par défaut
    Merci pour toutes ces suggestions. J'ai fait une petite fixation sur ce problème mais ton lien m'a éclaircit les idées. Je pense pouvoir m'en sortir maintenant

    Bonne journée

Discussions similaires

  1. Librairie graphique en mode console
    Par amohr3010 dans le forum Débuter
    Réponses: 2
    Dernier message: 15/12/2008, 22h04
  2. Interfaces graphiques en mode console ?
    Par kedare dans le forum Langages de programmation
    Réponses: 14
    Dernier message: 19/07/2007, 14h47
  3. interface graphique en mode console à la Edit
    Par subzero82 dans le forum Windows
    Réponses: 7
    Dernier message: 12/07/2006, 00h57
  4. Passage du mode console au mode graphique
    Par just1980 dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 23/10/2005, 20h48
  5. [2D] Apres le mode console, je m'attaque au graphique en C++
    Par tibouchou dans le forum Développement 2D, 3D et Jeux
    Réponses: 3
    Dernier message: 16/10/2005, 19h51

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