Plusieurs paths via GetCommandLineArgs() ?

Signaler
Messages postés
133
Date d'inscription
dimanche 20 mai 2007
Statut
Membre
Dernière intervention
13 juillet 2012
-
Messages postés
133
Date d'inscription
dimanche 20 mai 2007
Statut
Membre
Dernière intervention
13 juillet 2012
-
Salut tout le monde

Un mystère s'offre à moi aujourd'hui...

Je tente de récupérer en paramètre le path de plusieurs fichiers (je séléctionne quelques fichiers puis clique-droit, et lancement du programme via le menu contextuel). Seul problème, cela ne marche qu'avec un seul fichier à la fois...

J'utilise classiquement GetCommandLineArgs() qui me retourne bien sûr en premier argument le path de l'exe puis en second le path du fichier (si sélectionné seul). Mais avec deux fichiers ou plus, mon programme ne se lance même pas... je me suis dit que cela venait plus de la commande du registre ("C:\...\Prog.exe" "%1") que du code mais je ne trouve pas...

Merci d'avance pour vos lumières...
++
A voir également:

12 réponses

Messages postés
3275
Date d'inscription
jeudi 3 avril 2008
Statut
Membre
Dernière intervention
14 septembre 2014
4
bizarre ton truc
j'ai fais quelques petits inutilitaires en ligne de commande et ça fonctionne très bien
Messages postés
133
Date d'inscription
dimanche 20 mai 2007
Statut
Membre
Dernière intervention
13 juillet 2012
1
Salut Gillardg !

Tu arrives à récupérer le path de plusieurs fichiers avec GetCommandLineArgs() et "C:\...\Prog.exe" "%1" dans le registre ?
Moi ça marche pour un fichier mais pas plusieurs. Moi aussi j'ai déjà utilisé cela sur d'autres progs, mais je ne capturais qu'un fichier à la fois donc je n'avais pas eu à me poser la question....

Je teste avec un code du genre:

DimsArgsAsString=""
DimargsTab()As String=

GetCommandLineArgs()



            For i= 0To(ArgsTab.Length -1)
               
sArgs


&= argsTab(i)& vbCrLf

            Next

            MessageBox.Show(
sArgs

)



Des idées ? Peut être ma commande
"C:\...\Prog.exe" "%1" n'est-elle pas appropriée ?
Messages postés
3275
Date d'inscription
jeudi 3 avril 2008
Statut
Membre
Dernière intervention
14 septembre 2014
4
'j'utilise ceci et ça fonctionne très bien ça convertit 10 fichiers d'un coup

Imports




System.Drawing



Module

Module1



Dim

img


As

Image



Dim

x


As

Int32 = 0



Sub

Main()



For





Each

s


As





String





In





My

.Application.CommandLineArgs
x = x + 1
img = Image.FromFile(s)
img.Save(s & x &


".jpg"

, Imaging.ImageFormat.Jpeg)



Next

s



End





Sub
End





Module
Messages postés
133
Date d'inscription
dimanche 20 mai 2007
Statut
Membre
Dernière intervention
13 juillet 2012
1
Bon j'ai testé....

Passer par My donne un résultat un peu différent (ne retourne pas le path de l'exe en premier argument), je ne savais pas.  Mais ne me donne toujours pas les différents paths des fichiers sélectionnés.
Pas possible ça quand même ! Franchement là, je vois pô... Les commandes inscrites dans le registre me tracassent... Bon j'vais encore essayer de voir d'où ça peut venir, même si j'ai épuisé les ressources...

N'hésitez pas pour les idées...
++
Messages postés
133
Date d'inscription
dimanche 20 mai 2007
Statut
Membre
Dernière intervention
13 juillet 2012
1
Ahhhh...!

Non j'ai pô trouvé ;-) mais petite précision gillardg, ton prog en ligne de commande... tu le lances via le menu contextuel après avoir choisi tes fichiers, ou par la console windows ?
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
9
Salut sturtrid,

J'ai déjà développé un programme du genre, c'était un lecteur multimédia. Je crois que j'avais fais ça avec le framework 1.1, mais j'avais constaté que lorsque on ouvre plusieurs fichier en même temps, ça ouvre une instance du programme par fichier à ouvrir (oui oui ).

Mais le point positif, c'est qu'il y a un moyen très facile pour passer les arguments des autres instances à la 1ère instances. Plus d'info ici :

http://msdn.microsoft.com/fr-fr/library/b9z4eyh8(VS.80).aspx
Messages postés
133
Date d'inscription
dimanche 20 mai 2007
Statut
Membre
Dernière intervention
13 juillet 2012
1
Bon voilà du nouveau...

Les différents cas de figures:

- Sélection d'un seul fichier, clique-droit, lance le prog avec le menu contextuel
   = > Le programme reçoit le path du fichier en argument (OK)

- Sélection de plusieurs fichiers, clique-droit, lance le prog avec le menu contextuel

   => Le programme ne se lance pas...

- Sélection de plusieurs fichiers que je fais glisser sur l'icone du programme

   => Le programme se lance et reçoit le path de tous les fichiers en argument (OK), ce que je cherche à obtenir avec un simple clique-droit...

Euh.... j'vais devenir chèvre...
Une petite chandelle ?
++
Messages postés
133
Date d'inscription
dimanche 20 mai 2007
Statut
Membre
Dernière intervention
13 juillet 2012
1
Salut kevin !

Merci de t'arrêter un moment sur le problème.

Pour ma part, le prog ne se lance pas du tout en cas de sélection multiple (sauf en faisant glisser les sources, étrange non ?)... J'ai du mal à saisir la différence et surtout comment y remédier. Ah, mais je viens de penser, mon appli est en instance unique, mais une instance au moins devrait s'ouvrir... je vais tester pour voir.

++
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
9
Effectivement, le fait qu'aucune instance ne se lance est étrange.
Je vais peut-être tester, je te tiens au courant si j'ai du nouveau...
Messages postés
133
Date d'inscription
dimanche 20 mai 2007
Statut
Membre
Dernière intervention
13 juillet 2012
1
Je viens de tester en instances multiples, le programme ne se lance toujours pas...
Je teste avec ça maintenant:




For Each s AsStringInMy.Application.CommandLineArgs
        MessageBox.Show("items:"&My.Application.CommandLineArgs.Count.ToString & CrLf & s)
Next

Ce que je ne comprends vraiment pas, c'est pourquoi en faisant glisser les fichiers sur l'exe tout fonctionne parfaitement mais pas avec mon entrée dans le menu contextuel (sauf pour un seul fichier)...

Je dois y aller car demain j'ai du pain sur la planche, donc je regarderai demain si toi ou quelqu'un d'autre m'a répondu...

En tout cas merci et bonne soirée !
++
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
9
Alors j'ai testé. Ca fonctionne, mais il y à tout de même un truc étrange, et c'est surement le problème dans l'histoire.
J'ai créé un formulaire contenant une ListBox. Voici son code:

' Une référence de My.Application local pour capturer les évènements
Private WithEvents MyApp As My.MyApplication = My.Application

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    ' Ajouter chaque argument à la ListBox
    For Each arg As String In My.Application.CommandLineArgs
        Me.ListBox1.Items.Add(arg)
    Next
End Sub

Private Sub MyApp_StartupNextInstance(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs) Handles MyApp.StartupNextInstance
    ' Cette procédure s'exécute lorsque une deuxième instance de l'application est appelé
    ' Ajouter chaque argument à la ListBox
    For Each arg As String In e.CommandLine
        Me.ListBox1.Items.Add(arg)
    Next
End Sub

- Lorsque on glisse plusieurs fichiers sur l'exe, ça fonctionne.
- Lorsque on sélectionne plusieurs fichiers et qu'on fait bouton droit > Ouvrir avec > Programme.exe, ça ne fonctionne pas! mais :
- Lorsque on associe le format de fichier avec Programme.exe, et qu'ensuite on sélectionne plusieurs fichiers et qu'on fait bouton droit > Ouvrir, ça fonctionne (grâce à StartupNextInstance)
- Si on sélectionne plusieurs fichiers et qu'on presse la touche enter en return, ça fonctionne aussi (lorsque les fichiers sont associés)

Donc apparement, le seul cas ou ça ne fonctionne pas est celui du menu "Ouvrir avec". Est-ce un problème de .NET ou de Windows? Voici la réponse :
- Plusieurs fichiers .txt puis Ouvrir avec > Bloc note (mes txt sont associés avec le bloc note) => 1 seul ne s'ouvre
- Plusieurs fichiers .mp3 puis Ouvrir avec > Winamp (mes mp3 sont associés avec Winamp) => 1 seul ne s'ouvre
- Plusieurs fichiers .avi puis Ouvrir avec > Windows Media Player (mes avi sont associés avec WMP) => 1 seul ne s'ouvre

Donc ça ne fait pas de doute, il s'agit d'une limitation de Windows. Tu as beau chercher, tu n'y arrivera donc pas en utilisant le menu "ouvrir avec"

Mais je te donne une piste  J'ai créé un programme qui permet d'envoyer des images sur ImageShack (hébergement d'images) en faisant bouton droit > Envoyer vers > ImageShack. Et ça fonctionne aussi lorsque on sélectionne plusieurs fichiers
Messages postés
133
Date d'inscription
dimanche 20 mai 2007
Statut
Membre
Dernière intervention
13 juillet 2012
1
Salut !

Bon cette methode fonctionne, mais ne colle pas vraiment à ce que je recherche...
En ce qui concerne ton test, si j'ai bien suivi, tu es passé via le menu "Ouvrir avec..." et cela semble impliquer le passage d'un seul argument vers l'exe choisi (en vue du résultat obtenu), mais mon appli possède une entrée dédiée dans le menu contextuel comme c'est le cas pour Winrar, 7Zip, Unlocker, vlc, etc... Et il n'y a pas de limitation windows puisqu'il est possible de passer plusieurs fichiers en argument pour ces programmes (on peut compresser plusieurs fichiers, envoyer des media dans la playlist...)

D'après mes dernières recherches, le problème viendrait du type d'implantation de mon menu contextuel au niveau de la base de registre:

J'ai mis: 



"C:\...\MonProg.exe" "%1" comme valeur dans la clé
HKEY_CLASSES_ROOT\*\Shell\MonProg\Command

Et cela ne fonctionne que pour un unique argument (%1).

Pour que cela fonctionne j'aurais dû passer par une entrée dans:
 HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\MonProg, avec comme valeur un GUID qui pointe vers son entrée CLSID correspondante...
Mais là tout se complique, fini la simple commande


"C:\...\MonProg.exe" "%1", ce qu'il faut dans ce cas, c'est indiquer une dll !

Finalement j'ai trouvé une petite source sur CS de EBArtSoft - 2004 :
http://www.vbfrance.com/codes/MENU-CONTEXTUEL-SYSTEME_20732.aspx

C'est un excellent point de départ, seul problème, il s'agit d'une source en VB6 que je ne possède pas et ne maîtrise pas... Et la mise à niveau par VB 2008 n'est pas du tout fonctionnelle !

Si quelqu'un a des connaissances en VB6 et VB.net en parallèle, je ne suis pas contre une petite explication... Merci d'avance pour votre aide.

++