Question 152

Comment lancer un programme de façon synchrone depuis un programme VB? Comment attendre la fin de l'exécution d'un programme lancé depuis VB?

Dans l'article Comment exécuter un autre programme depuis une application VB ?, on a présenté plusieurs façons simples de lancer un autre programme depuis un programme VB. Dans les exemples présentés, les lancements se faisaient de façon asynchrone, c'est à dire que le programme était lancé depuis VB, puis le programme VB continuait son exécution.

On peut aussi vouloir lancer une application et attendre la fin de son exécution pour continuer. On parle dans ce cas de lancement synchrone.

Pour cela, on utilise ShellExecute et les API OpenProcess et WaitForSingleObject.

La fonction suivante, "ShellWait", est un exemple d'implémentation de ceci :

Option Explicit   

Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long   
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long   
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long   
Private Declare Function SetEnvironmentVariable Lib "kernel32" Alias "SetEnvironmentVariableA" (ByVal lpName As String, ByVal lpValue As String) As Long   

Private Function ShellWait(ByVal vCommand As String) As Boolean   

    Dim mProcess As Long   
    Dim mRet As Long   
    Dim mPID As Long   
    Dim bRet As Boolean   
       
    On Error GoTo ShellWait_Error   

    mPID = Shell(vCommand, vbMinimizedNoFocus)   
    mProcess = OpenProcess(&H1F0FFF, 0, mPID)   
    Do   
        mRet = WaitForSingleObject(mProcess, 1000)   
        If mRet <> &H102& Then   
            bRet = True   
            Exit Do   
        End If   
        DoEvents   
    Loop   
    CloseHandle mProcess   
ShellWait_OK:   
    On Error GoTo 0   
    Exit Function   

ShellWait_Error:   
    bRet = False   
    Resume ShellWait_OK   
End Function

Les fiches suivantes donnent des informations complémentaires sur l'utilisation de ces API :

Voir aussi :

Date de publication : 25 février 2007
Dernière modification : 25 février 2007
Rubriques : Fichiers & dossiers
Mots-clés : exécution,exécuter,lancer,application,programme,lancement,synchrone,attendre,fin,WaitForSingleObject,OpenProcess