Tim221
Messages postés26Date d'inscriptionvendredi 28 avril 2006StatutMembreDernière intervention20 décembre 2006
-
27 sept. 2006 à 16:49
Tim221
Messages postés26Date d'inscriptionvendredi 28 avril 2006StatutMembreDernière intervention20 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?
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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 #
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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 #
Tim221
Messages postés26Date d'inscriptionvendredi 28 avril 2006StatutMembreDernière intervention20 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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Tim221
Messages postés26Date d'inscriptionvendredi 28 avril 2006StatutMembreDernière intervention20 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é)
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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 #
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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...