begin process at 2008 08 30 12:44:59
1 234 003 membres
37 nouveaux aujourd'hui
14 294 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SHELLEXECUTEEX : OUVRIR FICHIER AVEC SON LECTEUR PAR DÉFAUT (ET LE FERMER)


Information sur la source

Catégorie :API Classé sous : shellexecuteex Niveau : Débutant Date de création : 27/11/2003 Date de mise à jour : 16/01/2004 11:50:42 Vu : 8 278

Note :
8,5 / 10 - par 4 personnes
8,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

Description

Ce code permet d'ouvrir un fichier avec son lecteur par défaut (en fonction du lien de la base de registre entre l'extension du fichier et un programme exécutable pour l'ouvrir).

On récupère le Handle (hWnd) du programme lançé et on peut ainsi fermer le programme lançé avec le ficheir quand on veut depuis son programme VB.

Source

  • Option Explicit
  • 'Flags ShellExecuteEx
  • Private Const SEE_MASK_NOCLOSEPROCESS = &H40
  • Private Const SEE_MASK_FLAG_NO_UI = &H400
  • 'Constantes ERREUR ShellExecuteEx
  • Private Const SE_ERR_FNF As Byte = 2
  • Private Const SE_ERR_PNF As Byte = 3
  • Private Const SE_ERR_ACCESSDENIED As Byte = 5
  • Private Const SE_ERR_OOM As Byte = 8
  • Private Const SE_ERR_SHARE As Byte = 26
  • Private Const SE_ERR_ASSOCINCOMPLETE As Byte = 27
  • Private Const SE_ERR_DDETIMEOUT As Byte = 28
  • Private Const SE_ERR_DDEFAIL As Byte = 29
  • Private Const SE_ERR_DDEBUSY As Byte = 30
  • Private Const SE_ERR_NOASSOC As Byte = 31
  • Private Const SE_ERR_DLLNOTFOUND As Byte = 32
  • 'Constantes AFFICHAGE ShellExecuteEx
  • Private Const SW_SHOWNORMAL = 1
  • Private Const SW_SHOW = 5
  • Private Const SW_SHOWDEFAULT = 10
  • Private Type SHELLEXECUTEINFO
  • cbSize As Long
  • fMask As Long
  • hWnd As Long
  • lpVerb As String
  • lpFile As String
  • lpParameters As String
  • lpDirectory As String
  • nShow As Long
  • hInstApp As Long
  • lpIDList As Long
  • lpClass As String
  • hkeyClass As Long
  • dwHotKey As Long
  • hIcon As Long
  • hProcess As Long
  • End Type
  • 'OpenProgram
  • Private Declare Function ShellExecuteEx Lib "shell32.dll" _
  • (SEI As SHELLEXECUTEINFO) As Long
  • 'CloseProgram
  • Private Declare Function CloseHandle Lib "kernel32" _
  • (ByVal hObject As Long) As Long
  • Private Declare Function TerminateProcess Lib "kernel32" _
  • (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
  • Private Declare Sub Sleep Lib "kernel32" _
  • (ByVal dwMilliseconds As Long)
  • ' ***********************************************************
  • ' *
  • ' * Lance le programme par défaut associé à un fichier (en fonction de son
  • ' * extension ) et retourne le hWnd de la fênetre du programme lançé.
  • ' *
  • ' ***********************************************************
  • Public Function OpenProgram(ByRef FileName As String, ByRef OwnerhWnd As Long) As Long
  • Dim SEI As SHELLEXECUTEINFO
  • On Error GoTo ErrorHandler
  • 'Vérifie si le fichier à lancer est un exécutable (.exe)
  • If GetExtension(FileName) = "exe" Then
  • If vbNo = MsgBox("ATTENTION, êtes-vous sûr de vouloir lancer ce programme exécutable ?", vbExclamation + vbYesNo) _
  • Then
  • OpenProgram = 0
  • Exit Function
  • End If
  • End If
  • With SEI
  • .cbSize = Len(SEI)
  • .fMask = SEE_MASK_NOCLOSEPROCESS Or SEE_MASK_FLAG_NO_UI
  • .hWnd = OwnerhWnd
  • .lpVerb = "open"
  • .lpFile = FileName
  • .lpParameters = vbNullChar
  • .lpDirectory = vbNullChar
  • .nShow = SW_SHOW
  • .hInstApp = OwnerhWnd
  • End With
  • OpenProgram = ShellExecuteEx(SEI)
  • If SEI.hInstApp <= 32 Then
  • 'Erreurs
  • OpenProgram = 0
  • Select Case SEI.hInstApp
  • Case SE_ERR_FNF
  • OpenProgram = SEI.hProcess
  • Case SE_ERR_PNF
  • MsgBox "Le chemin du fichier à ouvrir est incorrect.", vbExclamation
  • Case SE_ERR_ACCESSDENIED
  • MsgBox "Accès au fichier refusé.", vbExclamation
  • Case SE_ERR_OOM
  • MsgBox "Mémoire insuffisante.", vbExclamation
  • Case SE_ERR_DLLNOTFOUND
  • MsgBox "Dynamic-link library non trouvé.", vbExclamation
  • Case SE_ERR_SHARE
  • MsgBox "Le fichier est déjà ouvert.", vbExclamation
  • Case SE_ERR_ASSOCINCOMPLETE
  • MsgBox "Information d'association du fichier incomplète.", vbExclamation
  • Case SE_ERR_DDETIMEOUT
  • MsgBox "Opération DDE dépassée.", vbExclamation
  • Case SE_ERR_DDEFAIL
  • MsgBox "Opération DDE echouée.", vbExclamation
  • Case SE_ERR_DDEBUSY
  • MsgBox "Opération DDE occupée.", vbExclamation
  • Case SE_ERR_NOASSOC
  • 'Ouvrir avec...
  • Call Shell("rundll32.exe shell32.dll,OpenAs_RunDLL " + FileName, vbNormalFocus)
  • End Select
  • Else
  • 'Retourne le hWnd du programme lançé par ShellExecuteEx
  • OpenProgram = SEI.hProcess
  • End If
  • Exit Function
  • ErrorHandler:
  • OpenProgram = 0
  • End Function
  • ' ***********************************************************
  • ' *
  • ' * Ferme un programme à partir du hWnd de sa fenêtre.
  • ' *
  • ' ***********************************************************
  • Public Function CloseProgram(hWnd As Long) As Boolean
  • Dim lExitCode As Long
  • If hWnd = 0 Then
  • Exit Function
  • End If
  • CloseProgram = CBool(TerminateProcess(hWnd, lExitCode))
  • CloseHandle hWnd
  • DoEvents
  • Sleep (100)
  • End Function
Option Explicit

'Flags ShellExecuteEx
Private Const SEE_MASK_NOCLOSEPROCESS = &H40
Private Const SEE_MASK_FLAG_NO_UI = &H400

'Constantes ERREUR ShellExecuteEx
Private Const SE_ERR_FNF As Byte = 2
Private Const SE_ERR_PNF As Byte = 3
Private Const SE_ERR_ACCESSDENIED As Byte = 5
Private Const SE_ERR_OOM As Byte = 8
Private Const SE_ERR_SHARE As Byte = 26
Private Const SE_ERR_ASSOCINCOMPLETE As Byte = 27
Private Const SE_ERR_DDETIMEOUT As Byte = 28
Private Const SE_ERR_DDEFAIL As Byte = 29
Private Const SE_ERR_DDEBUSY As Byte = 30
Private Const SE_ERR_NOASSOC As Byte = 31
Private Const SE_ERR_DLLNOTFOUND As Byte = 32

'Constantes AFFICHAGE ShellExecuteEx
Private Const SW_SHOWNORMAL = 1
Private Const SW_SHOW = 5
Private Const SW_SHOWDEFAULT = 10

Private Type SHELLEXECUTEINFO
    cbSize As Long
    fMask As Long
    hWnd As Long
    lpVerb As String
    lpFile As String
    lpParameters As String
    lpDirectory As String
    nShow As Long
    hInstApp As Long
    lpIDList As Long
    lpClass As String
    hkeyClass As Long
    dwHotKey As Long
    hIcon As Long
    hProcess As Long
End Type

'OpenProgram
Private Declare Function ShellExecuteEx Lib "shell32.dll" _
(SEI As SHELLEXECUTEINFO) As Long


'CloseProgram
Private Declare Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As Long

Private Declare Function TerminateProcess Lib "kernel32" _
(ByVal hProcess As Long, ByVal uExitCode As Long) As Long

Private Declare Sub Sleep Lib "kernel32" _
(ByVal dwMilliseconds As Long)



' ***********************************************************
' *                                                         
' * Lance le programme par défaut associé à un fichier (en fonction de son
' * extension ) et retourne le hWnd de la fênetre du programme lançé.   
' *                                                         
' ***********************************************************

Public Function OpenProgram(ByRef FileName As String, ByRef OwnerhWnd As Long) As Long
    Dim SEI As SHELLEXECUTEINFO
    
    On Error GoTo ErrorHandler
    
    'Vérifie si le fichier à lancer est un exécutable (.exe)
    If GetExtension(FileName) = "exe" Then
        If vbNo = MsgBox("ATTENTION, êtes-vous sûr de vouloir lancer ce programme exécutable ?", vbExclamation + vbYesNo) _
        Then
            OpenProgram = 0
            Exit Function
        End If
    End If

    With SEI
        .cbSize = Len(SEI)
        .fMask = SEE_MASK_NOCLOSEPROCESS Or SEE_MASK_FLAG_NO_UI
        .hWnd = OwnerhWnd
        .lpVerb = "open"
        .lpFile = FileName
        .lpParameters = vbNullChar
        .lpDirectory = vbNullChar
        .nShow = SW_SHOW
        .hInstApp = OwnerhWnd
    End With
    
    OpenProgram = ShellExecuteEx(SEI)
    
    If SEI.hInstApp <= 32 Then
    'Erreurs
        OpenProgram = 0
        
        Select Case SEI.hInstApp
            Case SE_ERR_FNF
                OpenProgram = SEI.hProcess
            Case SE_ERR_PNF
                MsgBox "Le chemin du fichier à ouvrir est incorrect.", vbExclamation
            Case SE_ERR_ACCESSDENIED
                MsgBox "Accès au fichier refusé.", vbExclamation
            Case SE_ERR_OOM
                MsgBox "Mémoire insuffisante.", vbExclamation
            Case SE_ERR_DLLNOTFOUND
                MsgBox "Dynamic-link library non trouvé.", vbExclamation
            Case SE_ERR_SHARE
                MsgBox "Le fichier est déjà ouvert.", vbExclamation
            Case SE_ERR_ASSOCINCOMPLETE
                MsgBox "Information d'association du fichier incomplète.", vbExclamation
            Case SE_ERR_DDETIMEOUT
                MsgBox "Opération DDE dépassée.", vbExclamation
            Case SE_ERR_DDEFAIL
                MsgBox "Opération DDE echouée.", vbExclamation
            Case SE_ERR_DDEBUSY
                MsgBox "Opération DDE occupée.", vbExclamation
            Case SE_ERR_NOASSOC
                'Ouvrir avec...
                Call Shell("rundll32.exe shell32.dll,OpenAs_RunDLL " + FileName, vbNormalFocus)
        End Select
    Else
        'Retourne le hWnd du programme lançé par ShellExecuteEx
        OpenProgram = SEI.hProcess
    End If
    
    Exit Function
ErrorHandler:
    OpenProgram = 0
End Function

' ***********************************************************
' *                                                         
' * Ferme un programme à partir du hWnd de sa fenêtre.      
' *                                                         
' ***********************************************************

Public Function CloseProgram(hWnd As Long) As Boolean
    Dim lExitCode As Long
    
    If hWnd = 0 Then
        Exit Function
    End If
    
    CloseProgram = CBool(TerminateProcess(hWnd, lExitCode))
    CloseHandle hWnd
    DoEvents
    Sleep (100)
    
End Function

Conclusion

*************************************
Exemple d'utilisation :
PhWnd as Long

'*************************************
'Pour ouvrir le fichier avec le Viewer par défaut
PhWnd = OpenProgram ("c:\\document1.doc", Me.hWnd)


'***************************
'Pour fermer le viewer par défaut
Call CloseProgram (PhWnd)

                
  • signaler à un administrateur
    Commentaire de alainisfce le 15/01/2004 08:59:50

    Hello,

    Ton code est super, il repond à ce que je cherchais,
    mais comment on fait lorsque l'on a pas ta fonction msg
    pour savoir à quoi correspond la valeur des code d'erreur

    Pourrais tu me dire ou je peux trouver la fonction Getextention

    merci

  • signaler à un administrateur
    Commentaire de jockos le 16/01/2004 11:45:57

    Public Function GetExtension(ByRef sName As String) As String
        Dim start As Long
      
        start = InStrRev(sName, ".")
        GetExtension = Right$(sName, Len(sName) - start)
        
    End Function

  • signaler à un administrateur
    Commentaire de jockos le 16/01/2004 11:47:21

    Pour les codes d'erreur, je vais les rajouté à ma source...

    A+

  • signaler à un administrateur
    Commentaire de smellycat le 18/07/2004 19:35:14

    Ce source ne marche pas avec les programmes installés avec Microsoft INstaller, ainsi que les progs Word, excel et autres ....

  • signaler à un administrateur
    Commentaire de bastogne le 08/11/2005 17:05:25

    avec ce source (adapté à ma sauce) j'essaye de lancer l'application 'runas.exe' en lui rentrant des parametres en plus par rapport au source le problème est que j'obtient le message d'erreur "accès au fichier refusé" or j'ai les droits administrateur sur ma machine et que manuellement j'arrive à lancer correctement l'appli runas, si quelqu'un peut m'aider ce serait gentil

  • signaler à un administrateur
    Commentaire de FRSANGC le 02/01/2006 23:44:45

    Bonsoir,

    Tous mes bons voeux pour cette nouvelle année.

    Je débute en vb et je voudrais pouvoir ouvrir un fichier PDF à partir d'un fichier excel via Visual Basic.
    J'ai trouvé ce code je prense que c est exactement ce que je recherche mais je ne vois pas comment exécuter l'ouverture ou la fermeture du fichier pdf.
    En fait je voudrais avoir un BOUTON OUVRIR et un BOUTON FERMER qui en cliquant dessus ouvre le fichier Pdf (on va dire que le fichier est en C:\dossier\plan.pdf.
    Si vous pouviez m aider ce serait sympa c est pour le boulot
    Antoine
    Mon mail  antoine5945@hotmail.fr

  • signaler à un administrateur
    Commentaire de Vedlen le 01/10/2006 16:30:27

    Super, mais tu devrais éventuellement rajouter la fonction GetExtension dans le code au lieu de le faire dans le forum. Cependant je ne suis pas sûr qu'elle soit vraiment utile... 10/10

Ajouter un commentaire

Discussions en rapport avec ce code source

shellexecuteex par kara2006

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Boutique

Boutique de goodies CodeS-SourceS