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 plusieurs commandes avec ShellExecute


Sujet :

Windows

  1. #1
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Exécuter plusieurs commandes avec ShellExecute
    Bonjour,

    Je développe une petite application qui doit permettre (entre autre) d'effectuer toutes les actions de l'explorateur windows sur des fichiers (les actions que l'on peut accéder par le clic droit sur un fichier dans l'explorer, par exemple "ouvrir", "éditer", etc).

    Mais j'ai un problème lorsqu'il s'agit d'ouvrir plusieurs fichiers en même temps. Pour ce cas, je me base sur l'action "Play in Winamp" sur des fichiers .mp3.

    Dans la base de registre, cette action correspond à la commande suivante :
    "C:\Program Files\Winamp\winamp.exe" "%1"
    %1 étant remplacé par le nom du fichier.

    Je suis à peu près sur que l'explorateur windows, lorsque plusieurs mp3 sont séléctionnés, execute cette commande pour chacun des fichiers. C'est winamp ensuite qui se charge de son côté de detecter qu'il est executé plusieurs fois dans un temps "très court" pour créer une unique playlist avec les fichiers. (Et ne pas avoir qu'un seul fichier dans la playlist au final donc, puisque le paramètre "%1" represente toujours qu'un seul des fichiers sélectionnés).

    Je code mon appli en C#. J'ai d'abord essayé, en parsant la clé registre, d'utiliser Process.Start avec winamp comme programme et le nom d'un fichier de la liste en argument (en répétant cet appel pour tous les fichiers séléctionnés).
    Mais problème #1 : cela fonctionne, mais les fichiers ne sont pas dans l'ordre dans la playlist. Cela vient du fait (je pense) qu'à partir du moment ou on démarre un autre processus, on n'a plus aucun contrôle sur l'ordonnancement, et donc les différentes instances de winamp génèrent la playlist dans un ordre inattendu.

    Ensuite, j'ai essayé d'utiliser la fonction ShellExecute (qui provient de shell32.dll). Je lui passe en paramètre la commande "play" (telle qu'elle est inscrite dans le registre), et le nom d'un fichier mp3 en path, et je l'appelle une fois par fichier.
    Mais problème #2 : je me retrouve dans le cas où au final, winamp est ouvert seulement avec le dernier fichier de la liste. Apparemment, ShellExecute attend que le programme passe en mode où il récupère les messages windows avant de retourner, ce qui fait que winamp prends mes appels pour des appels distincts (comme si on lançait les mp3 a la main les uns après les autres : au final, on a plus que le dernier fichier dans la playlist).

    Ma question consiste donc à résoudre l'un des deux problèmes : soit réussir à "ordonner" les créations de processus via mes appels successifs à Process.Start, soit réussir à utiliser ShellExecute pour lancer une liste de fichiers. J'ai essayé divers méthodes d'appel pour passer en path non pas un fichier, mais une liste de fichier, mais à chaque fois la méthode ShellExecute me retourne un code 2 (file not found). Ce que j'ai testé entre autre :
    "fichier1" "fichier2"...
    "fichier1", "fichier2", ...
    "fichier1"; "fichier2"; ...

    Je préfèrerai d'ailleurs utiliser la méthode ShellExecute, qui est plus simple à généraliser que Process.Start (car parser les clés registres peut ne pas fonctionner pour des clés un peu exotique).

    Merci.

  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 518
    Points
    41 518
    Par défaut
    Je me demande s'il n'y a pas une histoire de DDE là-dedans. Et je ne sais pas à quel niveau c'est pris en compte par Explorer (est-ce pris en compte par ShellExecute() ou bien au niveau au-dessus?)
    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
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    DDE c'est pour communiquer avec une application qui est déjà lancée et en train de tourner, non ?
    Ici il s'agit de gérer le lancement de winamp... en exécutant n fois winamp.exe "file_x.mp3" de la même façon qu'explorer, pour que winamp arrive à interpréter correctement et mette les n fichiers dans la playlist.
    J'aimerais gérer ça à un niveau assez haut, c'est pour ça que j'ai tenté avec les fonctions de shell32.dll. La seule fonction qui permettent d'exécuter une application étant ShellExecute. Je n'ai rien trouvé de convaincant concernant les fonctions DDE (mais je connais rien au DDE, j'ai peut-être mal cherché...)

    Edit: et d'ailleurs apparemment, pour répondre à du DDE, l'application concerné doit être codé pour ça... ce qui n'est certainement pas le cas de toutes les applications inscrites dans la base de registre pour s'exécuter lorsque l'on double clic sur un fichier.

  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 518
    Points
    41 518
    Par défaut
    Ce que je voulais dire, c'est que je n'étais pas sûr que Winamp soit vraiment lancé X fois, je pensais plutôt à des conversations DDE une fois Winamp lancé (c'est la méthode utilisée pour d'autres programmes). Malheureusement, je n'ai pas de Winamp sous la main pour vérifier comment sont exactement faites ses associations de fichier.
    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
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Oui j'avais compris, mais je ne pense pas que ça soit le cas, puisque j'ai réussi à avoir plusieurs fichier dans la playlist en le lançant x fois (avec la méthode Process.Start()). Mais mon problème était que la playlist était dans le désordre, probablement dû à l'absence de synchronisation une fois les winamps lancés. Il me faut donc une méthode qui "attende" quelque chose avant de retourner (contrairement à Process.Start), mais qui attende "moins" que ShellExecute puisqu'avec cette méthode les fichiers ne sont pas regroupé dans la même playlist.

Discussions similaires

  1. Exécuter plusieurs commandes avec JSCH en EXEC ou en SHELL sur un switch
    Par alecorps dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 03/04/2012, 18h11
  2. exécuter une commande avec ShellExecute
    Par LN(a) dans le forum Delphi
    Réponses: 2
    Dernier message: 08/06/2007, 17h34
  3. Exécuter plusieurs commandes bat
    Par n@n¤u dans le forum Langage
    Réponses: 4
    Dernier message: 31/08/2006, 16h23
  4. [DEBUTANT] Ligne de commande avec ShellExecute()
    Par alainpeniche dans le forum Windows
    Réponses: 3
    Dernier message: 22/08/2005, 12h08
  5. Plusieurs commandes avec 1 seule R-commande
    Par pouldo dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 01/04/2005, 19h44

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