sturtrid
Messages postés133Date d'inscriptiondimanche 20 mai 2007StatutMembreDernière intervention13 juillet 2012
-
9 juil. 2008 à 19:09
sturtrid
Messages postés133Date d'inscriptiondimanche 20 mai 2007StatutMembreDernière intervention13 juillet 2012
-
14 juil. 2008 à 08:07
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...
sturtrid
Messages postés133Date d'inscriptiondimanche 20 mai 2007StatutMembreDernière intervention13 juillet 20121 9 juil. 2008 à 20:01
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 ?
sturtrid
Messages postés133Date d'inscriptiondimanche 20 mai 2007StatutMembreDernière intervention13 juillet 20121 9 juil. 2008 à 21:22
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...
++
Vous n’avez pas trouvé la réponse que vous recherchez ?
sturtrid
Messages postés133Date d'inscriptiondimanche 20 mai 2007StatutMembreDernière intervention13 juillet 20121 9 juil. 2008 à 21:27
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 ?
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 9 juil. 2008 à 22:26
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 :
sturtrid
Messages postés133Date d'inscriptiondimanche 20 mai 2007StatutMembreDernière intervention13 juillet 20121 9 juil. 2008 à 22:44
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.
sturtrid
Messages postés133Date d'inscriptiondimanche 20 mai 2007StatutMembreDernière intervention13 juillet 20121 9 juil. 2008 à 23:10
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...
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 10 juil. 2008 à 03:53
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
sturtrid
Messages postés133Date d'inscriptiondimanche 20 mai 2007StatutMembreDernière intervention13 juillet 20121 14 juil. 2008 à 08:07
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 !
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.