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 :

Exécuter un .exe avec des lignes de commande à partir du code ?


Sujet :

Windows

  1. #1
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut Exécuter un .exe avec des lignes de commande à partir du code ?
    Bonjour,

    Je suis en train d'aider une personne sur un autre forum qui débute en winAPI. (J'en profite, puisque le sujet de ce topic me sera utile lors du développement de mon prochain programme... un timer pour les tâches à effectuer) Afin de lancer son exécutable SDL permettant une visualisation spectrale à partir d'une lecture d'une musique (tout ça à partir d'un programme winAPI que l'on pourrait qualifier de launcher : il permet de choisir la musique), je lui ai conseillé ShellExecute.

    Dans son cas, on doit alors faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(hwnd, "open", "C:\\Dossier\\Programme.exe", "C:\\Musics\\MusiqueALire.mp3" /* ligne de commande */, 0, SW_SHOW);
    (du moins il me semble, d'après la traduction de msdn) Mais je ne sais pas sous quelle forme va arriver la ligne de commande afin de la récupérer dans les argc et argv standards du prototype de Main SDL.

    Si vous ne pouvez répondre, alors avez vous une autre idée ?

    Merci d'avance.
    Vive l'embarqué.

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    int main(int argc,char**argv)

    argv[0] : contient normalement le nom de l'executable(celui de la sdl dans ce cas)
    argv[1] : contient le premier paramètre passé à l'executable
    argv[2) le second etc
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    En effet, pour lancer un programme spécifique sur un document spécifique, cela doit être bon.

    Toutefois,
    1. L'avant-dernier âramètre devrait être NULL et non pas 0
    2. Afin d'être sûr de ne pas avoir de problème d'espaces, tu devrais entourer le nom de fichier de ' \" '

    Concernant les paramètres, il me semble que pour un programme en ligne de commande, tu as le système standard: argc=2 ici, argv[0] = chemin du programme, argv[1] = chemin de la musique (si tu as pris soin de mettre des guillemets)...
    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 Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    hebros -> Merci mais ça je le savais déjà... c'est assez élémentaire, quand même. Ce que je voulais savoir, c'est si la ligne de commande de ShellExecute sera découpée (à ce moment là, avec quel caractère), ou si toute la ligne se situera dans argv[1])

    Médinoc -> Merci de ces précisions, je n'y avais pas pensé. Mais je viens de penser à une chose en lisant ton post... comme la ligne de commande sera composée d'un nom de fichier à lancer avec le programme, pourquoi ne pas plutôt le mettre dans le paramètre de ShellExecute spécifiant le fichier à lancer avec le programme conçerné ?
    A ce moment là, comment faire pour exécuter plusieurs musiques à l'exécutable ?
    Vive l'embarqué.

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    hebros -> Merci mais ça je le savais déjà... c'est assez élémentaire, quand même. Ce que je voulais savoir, c'est si la ligne de commande de ShellExecute sera découpée (à ce moment là, avec quel caractère), ou si toute la ligne se situera dans argv[1])
    Non c'est hegros pas hebros

    Oui c'est assez élémentaire cependant cela ne change en rien la réponse à la question on récupére bien les arguments dans argv que tu as fournis à ton executable. Pourquoi la chaine serait découpée ??? Tu passes un paramètre tu le reçois dans argv[1] un second paramétre tu le reçois dans argv[2]...Aucune raison a ce que il y ait un quelconque découpage ou alors cela vient d'une mauvaise utilisation de shellexecute et je vois mal comment on pourrait trouver meilleur doc d'utilisation que la msdn...
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  6. #6
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Désolé

    Mais on ne peut pas passer plusieurs paramètres alors avec ShellExecute, puisqu'elle exécute en même temps que le passage des paramètres ?
    Alors pour mettre plusieurs paramètres, faudrait il mettre ceci comme 4ème paramètre ? : (tiens une expression ternaire )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "\"C:\\Dossier\\PremiereMusique.mp3\" \"C:\\Dossier\\DeuxiemeMusique.mp3\"/*etc*/"
    C'est ça ?
    Vive l'embarqué.

  7. #7
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Oui je pense que c'est comme ceci. A ce moment là, le chemin de PremiereMusique sera dans argv[1] et celui de DeuxiemeMusique dans argv[2].

    J'ai une petite question... les chemins relatifs ne sont ils pas acceptés par ShellExecute ? "./Bin/programme.exe" ne marche pas alors que "E:/Dune/MyProgram/Bin/programme.exe" (par exemple) oui.

    Auriez vous une explication ?

    [edit] désolé je voulais éditer...
    Vive l'embarqué.

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Alors:
    Pour le chemin d'accès relatif/absolu, je ne sais pas. Peut-être que le répertoire courant n'est plus le bon ensuite...
    (Par exemple: une FileDialog change le répertoire courant).
    Enfin bon, un petit GetFullPathName() à partir d'un chemin relatif peut résoudre le problème si tu es sûr que ton programme est dans le bon dossier...

    Pour le passage de paramètres, oui, je pense qu'il faut mettre les deux paramètres dans la même chaîne, séparé par des espaces (d'où l'utilité des guillemets si l'un des paramètres risque de comprendre des espaces).

    Pour la question sur ShellExecute et le fichier à lancer: Si tu choisis directement d'ouvrir le fichier, tu ne choisis pas quel programme le fait: C'est défini dans les associations de fichiers. Ici, tu cherches à ouvrir le MP3 avec un programme spécifique...
    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
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Exact. J'avais pensé aussi à récupérer le premier argument du WinMAin étant son chemin complet, mais cette fonction nous est encore plus adaptée

    Merci de ton aide, c'est tout ce que je voulais savoir.

    [topic résolu]
    Vive l'embarqué.

  10. #10
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    A vrai dire, GetFullPathName ne marche pas... je ne vois pas pourquoi.

    Comment s'utilise t elle ? Normalement, d'après msdn, on doit fournir le chemin relatif du fichier spécifié en guise de premier argument, ensuite MAX_PATH (c'est préférable), le buffer recevant le chemin, et 0, mais cela ne marche pas.

    Chose très bizarre même, il mixe le chemin relatif donné en premier argument avec une string n'ayant complètement aucun rapport étant le chemin de la musique que j'allais passer en paramètre à ShellExecute.

    Auriez vous une idée ?

    [edit] Attendez... une FileDialog change le répertoire courant ? Une common dialog box d'ouverture ? Eh bien cela vient sûrement de là alors... puisqu'il utilise une fileDialog pour choisir la musique. C'est donc pour ça qu'il les mixe.

    Mais alors, comment faire pour récupérer son chemin absolu ? Je ne vois alors pas en quoi peut m'aider GetFullpathName...

    [reedit] Suis-je bête... il suffit d'effectuer l'opération au tout début du programme... Bref, je lui ai résolu son problème (avec votre grande aide )
    Merci encore.
    Vive l'embarqué.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 22/10/2014, 11h35
  2. [Débutant] Créer un exe avec des arguments de ligne de commande
    Par Gigli dans le forum VB.NET
    Réponses: 1
    Dernier message: 06/02/2012, 09h35
  3. Exécuter un .exe avec des paramètres à partir d'un script python
    Par soufianesse dans le forum Général Python
    Réponses: 3
    Dernier message: 06/10/2011, 14h59
  4. Réponses: 6
    Dernier message: 19/05/2010, 15h42
  5. Exécuter un .exe avec des paramètres
    Par Coussati dans le forum Débuter
    Réponses: 8
    Dernier message: 01/02/2009, 20h26

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