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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    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
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    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 éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    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 éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    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 éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    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 *'

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