Titre: Lance fichier.

Description:

La fonction ShellExecute ouvre ou édite le fichier spécifié.
Ce fichier peut être un fichier exécutable ou un document.
En cas de succès, la valeur retournée par la fonction est le handle de l'application lancée ou celui de l'application DDE/serveur.
En cas d'échec, la valeur retournée par la fonction est un n° d'erreur inférieur ou égal à 32.

Le code:

Option Explicit
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
'La fonction ShellExecute ouvre ou édite le fichier spécifié.
'Ce fichier peut être un fichier exécutable ou un document.
'En cas de succès, la valeur retournée par la fonction est le handle de l'application lancée
' ou celui de l'application DDE/serveur
'En cas d'échec, la valeur retournée par la fonction est un n° d'erreur inférieur ou égal à 32.
'je vous fais grâce des erreurs possibles, que vous verrez plus bas (constantes auto-explicites)
'=====Les paramètres===========================================
'=== hwnd : spécifie le handle de la fenêtre parent. Cette fenêtre est celle qui reçoit
' les boites de message générées par l'application (donc également les messages d'erreur)
'=== lpOperation : représente un pointeur vers une chaîne de caractères terminée par un NULL
' et qui spécifie l'opération à exécuter. Sont valables les chaines suivantes :
' ---open : la fonction ouvre le fichier (qui peut être un fichier
' exécutable ou un document, mais également un répertoire à
' ouvrir), spécifié par lpfile.

' ---print : La fonction édite le fichier spécifié par lpfile, fichier qui ne peut alors
' qu'être un document
' Si toutefois, le fichier est finalement un exécutable, la fonction ouvre ce
' fichier comme si "open" avait été utilisé au lieu de "Print"

' ---Explore : la fonction explore le répertoire spécifié par lpfile

' le paramètre lpOperation peut être un NULL. Dans un tel cas, la fonction ouvre le fichier
' spécifié par lpfile.
'=== lpFile : représente un pointeur vers une chaîne de caractères terminée par un NULL et qui
' spécifie le fichier à ouvrir ou éditer ou le répertoire à ouvrir ou explorer.
' La fonction peut ouvrir un exécutable ou un fichier document. Elle peut éditer un
' fichier document.
'=== lpParameters : représente un pointeur vers une chaîne de caractères terminée par un NULL, qui
' spécifie les paramètres à passer à l'application (si lpfile est un exécutable
' uniquement)
' Si lpfile n'est pas un exécutable, le paramètre lpParameters doit être un NULL.
'=== lpDirectory : représente un pointeur vers une chaîne de caractères terminée par un NULL et
' qui spécifie je répertoire par défaut.


'=== nShowCmd : Spécifie la façon dont l'application doit être montrée à l'ouverture, si lpfile
' est un exécutable uniquement
' Ce pâramètre peut recevoir l'une des valeurs suivantes :

' SW_HIDE (pour cacher la fenêtre et en activer une autre) - SW_MAXIMIZE (pour "maximiser"
'l'affichage de la fenêtre) - SW_MINIMIZE (pour "minimiser" l'affichage de la fenêtre et
'activer la fenêtre suivante en respectant le "zorder") - SW_RESTORE (pour activer et afficher la
'fenêtre. Si celle-ci est "maximisée" ou "minimisée", Windows la restitue dans ses dimensions et
'position d'origine. A spécifier donc pour restaurer) - SW_SHOW (pour activer la fenêtre et l'afficher
'dans ses dimensions et position en cours) - SW_SHOWDEFAULT (règle l'état d'affichage sur la base
'du flag SW_... spéciifié dans la structure STARTUPINFO passée à la fonction CreateProcess
'par le programme ayant démarré l'application. Une application doit appeler ShowWindow avec ce
'"flag" pour définir l'état initial d'affichage de sa fenêtre principale) - SW_SHOWMAXIMIZED (pour
'activer la fenêtre et l'afficher à ses dimensions maximum) - SW_SHOWMINIMIZED (pour activer la
' fenêtre et l'afficher à ses dimensions minimum) - SW_SHOWMINNOACTIVE (pour afficher la fenêtre
' comme une fenpetre réduite, la fenêtre restant active) - SW_SHOWNA (pour afficher dans les dimensions
'position en cours, la fenêtre restant active) - SW_SHOWNOACTIVATE (pour afficher la fenêtre dans
'ses plus récentes dimensions et position,la fenêtre restant active) - SW_SHOWNORMAL (pour afficher
'et activer une fenêtre. Si cette dernière est "maximisée" ou "minimisée", Windows la restaure
'dans ses dimensions et position d'origine. Une application doit spécifier ce "flag" lors du premier
'affichage d'une fenêtre)
'Si lpFile désigne un fichier document, nShowCmd doit avoir la valeur 0 (zero).

Private Declare Function ShellExecuteForExplore Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, lpParameters As Any, lpDirectory As Any, ByVal nShowCmd As Long) As Long
Public Enum EShellShowConstants
zouSW_HIDE = 0
zouSW_MAXIMIZE = 3
zouSW_MINIMIZE = 6
zouSW_SHOWMAXIMIZED = 3
zouSW_SHOWMINIMIZED = 2
zouSW_SHOWNORMAL = 1
zouSW_SHOWNOACTIVATE = 4
zouSW_SHOWNA = 8
zouSW_SHOWMINNOACTIVE = 7
zouSW_SHOWDEFAULT = 10
zouSW_RESTORE = 9
zouSW_SHOW = 5
End Enum
Private Const ERROR_FILE_NOT_FOUND = 2&
Private Const ERROR_PATH_NOT_FOUND = 3&
Private Const ERROR_BAD_FORMAT = 11&
Private Const SE_ERR_ACCESSDENIED = 5 ' accès interdit
Private Const SE_ERR_ASSOCINCOMPLETE = 27
Private Const SE_ERR_DDEBUSY = 30
Private Const SE_ERR_DDEFAIL = 29
Private Const SE_ERR_DDETIMEOUT = 28
Private Const SE_ERR_DLLNOTFOUND = 32
Private Const SE_ERR_FNF = 2 ' Fichier non trouvé
Private Const SE_ERR_NOASSOC = 31
Private Const SE_ERR_PNF = 3 ' chemin inconnu
Private Const SE_ERR_OOM = 8 ' dépassement de mémoire
Private Const SE_ERR_SHARE = 26

Public Function ShellEx(ByVal sFile As String, _
Optional ByVal eShowCmd As EShellShowConstants = zouSW_SHOWDEFAULT, _
Optional ByVal sParameters As String = "", _
Optional ByVal sDefaultDir As String = "", _
Optional sOperation As String = "open", _
Optional Owner As Long = 0 _
) As Boolean
Dim lR As Long
Dim lErr As Long, sErr As String
If (InStr(UCase$(sFile), ".EXE") <> 0) Then
eShowCmd = 0
End If
On Error Resume Next
If (sParameters = "") And (sDefaultDir = "") Then
lR = ShellExecuteForExplore(Owner, sOperation, sFile, 0, 0, zouSW_SHOWNORMAL)
Else
lR = ShellExecute(Owner, sOperation, sFile, sParameters, sDefaultDir, eShowCmd)
End If
'MsgBox lR
If (lR < 0) Or (lR > 32) Then
ShellEx = True
Else
lErr = vbObjectError + 1048 + lR
Select Case lR
Case 0
lErr = 7: sErr = "Dépassement de mémoire"
Case ERROR_FILE_NOT_FOUND
lErr = 53: sErr = "Fichier non trouvé"
Case ERROR_PATH_NOT_FOUND
lErr = 76: sErr = "Chemin inconnu"
Case ERROR_BAD_FORMAT
sErr = "L'exécutable n'est pas valide ou est corrompu"
Case SE_ERR_ACCESSDENIED
lErr = 75: sErr = "Erreur/ accès au répertoire ou au fichier"
Case SE_ERR_ASSOCINCOMPLETE
sErr = "Ce type de fichier est sans association valable"
Case SE_ERR_DDEBUSY
lErr = 285: sErr = "Le fichier n'a pu être ouvert car en cours d'utilisation. Recommencez plus tard SVP."
Case SE_ERR_DDEFAIL
lErr = 285: sErr = "Le fichier n'a pu être ouvert car la transaction DDE a failli. Recommencez plus tard SVP."
Case SE_ERR_DDETIMEOUT
lErr = 286: sErr = "Le fichier n'a pu être ouvert (délai max dépassé). Recommencez plus tard SVP."
Case SE_ERR_DLLNOTFOUND
lErr = 48: sErr = "Impossible de trouver la DLL spécifiée."
Case SE_ERR_FNF
lErr = 53: sErr = "Fichier non trouvé"
Case SE_ERR_NOASSOC
sErr = "Aucune association définie pour ce type de fichier"
Case SE_ERR_OOM
lErr = 7: sErr = "Mémoire épuisée"
Case SE_ERR_PNF
lErr = 76: sErr = "Chemin inconnu"
Case SE_ERR_SHARE
lErr = 75: sErr = "Violation de partage !."
Case Else
sErr = "Une erreur a surgi au moment d'essayer d'ouvrir ou d'éditer le fichier choisi."
End Select

MsgBox "Error n°" & CStr(lErr) & Chr(13) & sErr & " sur ouverture : " & Chr(13) & sFile, vbCritical
ShellEx = False
End If
End Function

Private Sub Command1_Click()
If ShellEx("c:\tmp") Then MsgBox "Ouverture repertoire OK" ' pour ouvrir, si possible, le répertoire de ce chemin
If ShellEx("c:\tmp\toto.txt") Then MsgBox "Ouverture fichier texte ok" 'pour ouvrir, si possible, le fichier de ce chemin
If ShellEx("c:\tmp\Liste.xls") Then MsgBox "Ouverture excel avec fichier liste.xls OK"
End Sub