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 :

Récupérer les paramètres passés en commande


Sujet :

Windows

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut Récupérer les paramètres passés en commande
    Bonjour,

    Ceci est assez basique, mais je viens de me rendre compte que sous Windows, nous n'avons pas un char ** argv et un int argc pour récupérer les paramètres passés en ligne de commande.
    On a donc une chaine de caractère LPSTR commandLine qui contient je suppose les paramètres les uns à la suite des autres séparés par un espace.

    Je me demandais si il existait une fonction qui permettait de récupérer directement les paramètres, où si nous étions obligés de parser cette chaîne?

  2. #2
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Je me demandais si il existait une fonction qui permettait de récupérer directement les paramètres, où si nous étions obligés de parser cette chaîne?
    voir :

    CommandLineToArgvW() sur la MSDN : http://msdn2.microsoft.com/en-us/library/bb776391.aspx

  3. #3
    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
    En unicode, il y a la fonction CommandLineToArgvW().
    Sinon, la CRT de microsoft utilise la fonction interne __getmainargs(), qui utilise la fonction interne _setargv(), définie dans setargv.c.
    ...Et qui est un beau bazar.

    Les considérations à prendre en compte:
    • Gérer correctement les " pour ne pas séparer ce qu'il y a entre deux "
    • Transformer correctement "" ou \" dans une chaîne
    • Séparer selon les espaces
    • Gérer ou non les wildcards


    À mon avis, il sera plus simple de convertir la chaîne en unicode, appeler CommandLineToArgvW() et faire les conversions dans l'autre sens, si tu veux avoir les arguments en non-unicode...
    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.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut
    En fait, c'est vraiment que pour récupérer deux int...
    Il faut ensuite les "caster" en int ou pas?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut
    Oula, déjà pourquoi les types demandés ne sont pas les mêmes?

    Error :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     error C2664: 'CommandLineToArgvW' : cannot convert parameter 1 from 'char *' to 'const unsigned short *'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR commandLine, int nShowCmd)
    {
    	int argc = 0;
    	LPWSTR * argv = CommandLineToArgvW(GetCommandLine(), &argc);
    	if (2 == argc) 
    	{
    		// TODO verif si c'est bien des int en param
    		int x = (int)argv[0];
    		int y = (int)argv[1];
    		MyCreateWindow(hInstance, hPrevInstance, commandLine, nShowCmd, 1, x, y);
    	}
    	return 0;
    }
    Pour la verification des paramètres, je suis sure que ce n'est pas ce qu'il faut faire... je suis en cous de recherche...

  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
    Parce que c'est une fonction 'wide' : Comme je l'ai dit, ça ne marche qu'en unicode, avec une fonction wWinMain() (ou _tWinMain() avec les bonnes options de compilation), sur des WCHAR, etc.
    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
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut
    J'ai repris la doc msdn et j'ai changé avec la bonne fonction GetCommandLine ()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LPWSTR * argv = CommandLineToArgvW(GetCommandLine(), &argc);
    Et j'ai toujours un problème, ce que je ne comprends pas, c'est pourquoi "Windows" ne fait pas directement des fonctions adaptées au bon types puisque le synopsis de la fonction WinMain ne change jamais...?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    error C2664: 'CommandLineToArgvW' : cannot convert parameter 1 from 'char *' to 'const unsigned short *'

  8. #8
    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
    Perdu, elle change. Si tu relis mon post, tu verras que tu peux avoir wWinMain() au lieu de WinMain().
    (ou _tWinMain() qui fait dépendre cela des options de compilation).
    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.

  9. #9
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Dans le cas où _UNICODE ne serait pas défini, une autre possibilité serait de convertir la ligne de commande en Unicode, e.g :

    (attention, gestion d'erreur plus que minimale...)

    Code C : 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
     
    int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow)
    {
        size_t cmdSize = 0;
        wchar_t* wcmdLine = NULL;
        LPWSTR* pArgv = NULL;
        int numOfArgs = 0;
        int arg1 = 0;
        int arg2 = 0;
     
     
        cmdSize = strlen(lpszArgument)+1;
        wcmdLine = malloc(cmdSize * sizeof(wchar_t));
     
        MultiByteToWideChar( CP_ACP, 0, lpszArgument, cmdSize, wcmdLine, (cmdSize * sizeof(wchar_t)) );
        pArgv = CommandLineToArgvW(wcmdLine, &numOfArgs);
        if((numOfArgs == 2) && (pArgv != NULL))
        {
            arg1 = _wtoi(pArgv[0]);
            arg2 = _wtoi(pArgv[1]);
        }
     
        free(wcmdline);
     
        /* ... */
    }

  10. #10
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 109
    Points : 168
    Points
    168
    Par défaut
    Tu peux utiliser __argc et __argv

    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
    #include <windows.h>
    #include <stdlib.h>
    
    int WINAPI WinMain(HINSTANCE a, HINSTANCE b, LPSTR c, int d)
    {
      int  i;
      char buf[260];
    
      // Nombre argument(s)
      wsprintf(buf, "argc = %d\n\n", __argc); 
    
      // Liste argument(s)
      for(i = 0; i < __argc; i++)
        wsprintf(buf + lstrlen(buf), "argv[%d] = %s\n", i, __argv[i]); 
    
      return MessageBox(0, buf, __argv[0], 0);
    }

  11. #11
    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
    En effet, le code de la CRT indique que __argc et __argv sont réglés systématiquement quel que soit le type d'exécutable.
    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.

  12. #12
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 21
    Points : 22
    Points
    22
    Par défaut
    Merci pour cette astuce des __argv et __argc

  13. #13
    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
    C'est un détail d'implémentation, je déconseillerais de s'en servir...
    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.

  14. #14
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 21
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    C'est un détail d'implémentation, je déconseillerais de s'en servir...
    Je vais pas le faire finalement, ça n'a pas l'air de fonctionner en plus, et je ne vois pas pourquoi.

Discussions similaires

  1. Boulette dans code FAQ Comment récupérer les paramètres passés dans une url
    Par NoSmoking dans le forum Contributions JavaScript / AJAX
    Réponses: 5
    Dernier message: 14/11/2013, 13h17
  2. Réponses: 11
    Dernier message: 06/09/2006, 12h48
  3. [C#] - Récupérer les paramètres passés à une application
    Par linuxludo dans le forum Windows Forms
    Réponses: 4
    Dernier message: 14/11/2005, 14h41
  4. [Débutant] Récupérer les paramètres d'une routine
    Par nifty dans le forum Assembleur
    Réponses: 5
    Dernier message: 18/04/2005, 14h35
  5. Réponses: 4
    Dernier message: 04/07/2003, 19h13

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