Lancer l'item sélectionné Listbox

Résolu
Tim221 Messages postés 26 Date d'inscription vendredi 28 avril 2006 Statut Membre Dernière intervention 20 décembre 2006 - 27 sept. 2006 à 16:49
Tim221 Messages postés 26 Date d'inscription vendredi 28 avril 2006 Statut Membre Dernière intervention 20 décembre 2006 - 28 sept. 2006 à 18:19
Bonjour, j'ai créé une dll avec un userform contenant une listbox,

cette listbox récupère tout les fichiers voulu avec deux textboxs.

Le problème est que je voudrais lancer le chemin obtenu (par ex: C:\Program Files\etc... .exe ou .txt) avec le programme qui correspond à l'extension et ceci quand je clique sur Button1.

Existe-t-il un bout de code permettant de faire ceci?

Merci d'avance.

11 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
27 sept. 2006 à 17:56
Tiens, voila un code que j'avais fais dans le temps pour ouvrir un fichier PDF, quelque soit la version d'acrobat reader d'installée sur la machine. Et accessoirement quelque soit le logiciel qui lit les pdf.

Ce code marche avec n'importe quel fichier, à partir du moment ou c'est un exécutable qui est associer à l'extension.

Tu colle ça dans un module, et tu appele ta fonction ainsi OuvrirFichier ListBox1.Text

Public Declare Function CloseHandle Lib "kernel32" ByVal hObject As Long) As Long 
Public Declare Function FindExecutable Lib "shell32.dll" Alias "FindExecutableA" ByVal lpFile As String, _ 
                                                                                  ByVal lpDirectory As String, _ 
                                                                                  ByVal lpResult As String) As Long 
Public Declare Function OpenProcess Lib "kernel32" ByVal dwDesiredAccess As Long, _ 
                                                    ByVal bInheritHandle As Long, _ 
                                                    ByVal dwProcessId As Long) As Long 
Public Declare Function WaitForSingleObject Lib "kernel32" ByVal hHandle As Long, _ 
                                                            ByVal dwMilliseconds As Long) As Long 

Public Const INFINITE = &HFFFFFFFF        '  Infinite timeout
Public Const SYNCHRONIZE = &H100000 

'---------------------------------------------------------------------------------------
' Procedure : OuvrirFichier
' DateTime  : 05/08/2006 14:08
' Author    : Casy
' Purpose   : Permet d'ouvrir un document PDF avec l'applicatif par défaut.
'             Vérifie d'abord si le fichier existe, si un applicatif est installé
'             Possibilité de bloquer le process tant que l'applicatif n'est pas fermé
'             Retourne TRUE si l'ouverture s'est bien passée, FALSE sinon.
'---------------------------------------------------------------------------------------
Public Function OuvrirFichier(fichier As String, Optional attenteFermeture As Boolean = False) As Boolean 
Dim fileappli As String * 250 
Dim result As Integer 
Dim temp As String 
Dim fichAOuvrir As String 

temp = Dir$(fichier)   'recherche si le fichier existe
If temp <> "" Then 
    ' Le fichier existe

    ' Recherche Acrobat Reader ou autre
    result = FindExecutable(fichier, vbNullString, fileappli) 
    If result > 32 Then 
         ' Acrobat reader installé
        i = InStr(1, fileappli, Chr(0), vbBinaryCompare) - 1 
        fichAOuvrir = """" & Left$(fileappli, i) & """ " & fichier 
    Else 
        ' Acrobat Reader pas installé
        OuvrirFichier = False 
        Exit Function 
    End If 
Else 
    ' Le fichier n'existe pas
    OuvrirFichier = False 
    Exit Function 
End If 

' Ouverture du fichier PDF
pid = Shell(fichAOuvrir, vbMaximizedFocus) 
If pid <> 0 Then 
    ' Si attente fermeture demandé, on suspend le process jusqu'à que Acrobat soit fermé.
    If attenteFermeture = True Then 
        phnd = OpenProcess(SYNCHRONIZE, 0, pid) 
        If phnd <> 0 Then 
            Call WaitForSingleObject(phnd, INFINITE) 
            Call CloseHandle(phnd) 
        End If 
    End If 

    OuvrirFichier = True 
Else 
    OuvrirFichier = False 
End If 

End Function 

<small>Coloration syntaxique
automatique</small>

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
27 sept. 2006 à 20:48
lol, Julien, ma touche parenthèse marche bien. C'est le module de coloration syntaxique que j'utilise qui est allergique à cette paranthèse. Je le sais mais chaque fois j'oubli de corriger.

Tim221, Fileappli est égal à Nothing parce que .net n'accepte plus les déclarations de chaines à longueur fixe.

Voici le nouveau code BETEMENT traduit par l'assistant de convertion. Attention ce code est du code VB6 converti en .NET
Il est certainement possible de faire un bien meilleur code purement .NET

Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Integer) As Integer 
Public Declare Function FindExecutable Lib "shell32.dll"  Alias "FindExecutableA"(ByVal lpFile As String, ByVal lpDirectory As String, ByVal lpResult As String) As Integer 
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Integer, ByVal dwProcessId As Integer) As Integer 
Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Integer, ByVal dwMilliseconds As Integer) As Integer 
 
Public Const INFINITE As Integer = &HFFFFFFFF  '  Infinite timeout
Public Const SYNCHRONIZE As Integer = &H100000 
 
'--------------------------------------------------------------------------------------- 
' Procedure : OuvrirFichier (Converti par VB.NET2005)
' DateTime  : 27/09/2006 18:20
' Author    : Casy
' Purpose   : Permet d'ouvrir un document avec l'applicatif (.exe) par défaut.
'             Vérifie d'abord si le fichier existe, si un applicatif est installé
'             Possibilité de bloquer le process tant que l'applicatif n'est pas fermé
'             Retourne TRUE si l'ouverture s'est bien passée, FALSE sinon.
'--------------------------------------------------------------------------------------- 
Public Function OuvrirFichier(ByRef fichier As String, Optional ByRef attenteFermeture As Boolean = False) As Boolean 
Dim fileappli As New VB6.FixedLengthString(250) 
Dim result As Short 
Dim temp As String 
Dim fichAOuvrir As String 
Dim i As Short 
Dim pid As Double 
Dim phnd As Integer 

On Error GoTo OuvrirFichier_Error 
 
temp = Dir(fichier)  'recherche si le fichier existe
If temp <> "" Then 
' Le fichier existe 
 
' Recherche l'exécutable associé 
result = FindExecutable(fichier, vbNullString, fileappli.Value) 
If result > 32 Then 
' Association trouvée 
i = InStr(1, fileappli.Value, Chr(0), CompareMethod.Binary) - 1 
fichAOuvrir = """" & Left(fileappli.Value, i) & """ " & fichier 
Else 
' Aucune association de trouvée 
OuvrirFichier = False 
Exit Function 
End If 
Else 
' Le fichier n'existe pas 
OuvrirFichier = False 
Exit Function 
End If 
 
' Ouverture du fichier
pid = Shell(fichAOuvrir, AppWinStyle.MaximizedFocus) 
If pid <> 0 Then 
' Si attente fermeture demandé, on suspend le process jusqu'à que le logiciel soit fermé. 
If attenteFermeture = True Then 
phnd = OpenProcess(SYNCHRONIZE, 0, pid) 
If phnd <> 0 Then 
Call WaitForSingleObject(phnd, INFINITE) 
Call CloseHandle(phnd) 
End If 
End If 
 
OuvrirFichier = True 
Else 
OuvrirFichier = False 
End If 

On Error GoTo 0 
Exit Function 

OuvrirFichier_Error:  
 
OuvrirFichier = False 
 
'---- Code à personaliser en cas d'erreur -------------------------------------------------
Dim message As String 
message = "Erreur " & Err.Number & " (" & Err.Description & ") dans la procedure OuvrirFichier" & vbCrLf & vbCrLf 
message = message & "Vérifier que le fichier est accessible !" & vbCrLf 
message = message & "Vérifier que le logiciel associé est un exécutable !" 
MsgBox(message, CDbl(MsgBoxStyle.Critical & MsgBoxStyle.OKOnly), "ERREUR - OuvrirFichier") 
'------------------------------------------------------------------------------------------ 
 
End Function 

<small>Coloration syntaxique
automatique</small>

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
27 sept. 2006 à 17:02
ben tu fais shell("nom_du_fichier"), je pense que ça marche.

Sinon si tu veux vraiment le chemin de l'exécutable pour le lancer, tu peux utiliser l'api FindExecutable.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
Tim221 Messages postés 26 Date d'inscription vendredi 28 avril 2006 Statut Membre Dernière intervention 20 décembre 2006
27 sept. 2006 à 17:30
Le problème avec Shell c'est que je fais Shell(itemsélectionner) et quand il utilise la fonction le contenant, il arrête le programme.

Et indique le shell, il me dit que le fichier est égal à nothing alors que si je pointe sur itemsélectionner il me dit le chemin que je lui avait donné.

Et je ne sais pas comment appeler l'api findexecutable.

Merci de me dire comment l'appeler.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Tim221 Messages postés 26 Date d'inscription vendredi 28 avril 2006 Statut Membre Dernière intervention 20 décembre 2006
27 sept. 2006 à 18:59
Je n'arrive pas a faire marcher le code car pid et phnd, je ne vois pas ce qu'il représente (Microsoft Visual Basic Express Edition 2005 dit qu'il ne sont pas déclaré)

Pourrais-tu me dire à quoi ils correspondent?
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
27 sept. 2006 à 19:07
Oui c'est un oubli de ma part

Déclarations à rajouter
Dim i As Integer
Dim pid As Double
Dim phnd As Long

Attention ce code est prévu pour VB6 (rubrique où tu as poster ta question).
Pour VB2005, il faut faire quelques adaptations (types de variables, déclarations des string, ...)

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
27 sept. 2006 à 19:21
Voilà pour les déclarations en .Net2 : (M'enfin ta touche ouvrir parenthèes est cassée casy :p ?)

Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject AsInteger) As Long 
Public Declare Function FindExecutable Lib "shell32.dll" Alias "FindExecutableA" (ByVal lpFile As String, _ 
                                                                                  ByVal lpDirectory As String, _ 
                                                                                  ByVal lpResult As String) AsInteger
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess AsInteger,_ 
                                                    ByVal bInheritHandle AsInteger, _ 
                                                    ByVal dwProcessId AsInteger) AsInteger
Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle AsInteger, _ 
                                                            ByVal dwMilliseconds AsInteger) AsInteger

Attention, selon la manière dont tu vas traiter les handle, tu peux aussi devoir utiliser IntPtr à la place de Integer dans leurs déclarations...

Julien.
0
Tim221 Messages postés 26 Date d'inscription vendredi 28 avril 2006 Statut Membre Dernière intervention 20 décembre 2006
27 sept. 2006 à 19:29
Merci, alors il y a eu un problème car j'étais sûr d'avoir mis Visual Basic 2005\Divers\Débutant\..

Donc le code ne marche pas, je l'ai mis a niveau mais dans FindExecutable, fileappli est égal à nothing.

Ps: je récréer un post dans VB2005 ou pas
0
Tim221 Messages postés 26 Date d'inscription vendredi 28 avril 2006 Statut Membre Dernière intervention 20 décembre 2006
27 sept. 2006 à 19:31
Désolé j'avais pas fini ma phrase:


Fileappli est égal à Nothing et arrête le programme et VB me dit  tentative de lecture ou écriture de mémoire protégé.
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
27 sept. 2006 à 20:49
Arffff, la mise en page à quelque peu merdé. Heureusement que vb.net va remettre ça automatiquement en place

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
Tim221 Messages postés 26 Date d'inscription vendredi 28 avril 2006 Statut Membre Dernière intervention 20 décembre 2006
28 sept. 2006 à 18:19
Merci ça marche


Et désolé de mettre trompé de catégorie. 
0
Rejoignez-nous