Execution de commande et attente de fin

Soyez le premier à donner votre avis sur cette source.

Snippet vu 36 142 fois - Téléchargée 36 fois

Contenu du snippet

Le code ci-dessous permet d'executer un programme externe, un peu comme la fonction Shell(), mais la, le programme VB ne reprend la main que lorsque le programme externe lancé est fini ...
Placez ce code dans un module standard et utilisez la procédure ShellWait "..." depuis votre code.
Exemple : ShellWait "cmd.exe /c dir c:\*.*>c:\DirC.txt"

Source / Exemple :


Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Const STILL_ACTIVE = &H103
Private Const PROCESS_QUERY_INFORMATION = &H400

Public Sub ShellWait(ByVal JobToDo As String)
Dim hProcess As Long, RetVal As Long
    
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(JobToDo, vbMinimizedNoFocus))
    Do
        GetExitCodeProcess hProcess, RetVal
        DoEvents
        Sleep 100
    Loop While RetVal = STILL_ACTIVE
End Sub

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
jeudi 28 octobre 2004
Statut
Membre
Dernière intervention
12 avril 2011

Juste une alternative sans passer par les API Windows :

Sub ShellAndWait(PathName As String, _
Optional WindowsStyle As VbAppWinStyle = vbMinimizedFocus)

Dim ShellCmdPath As String
Dim FileNumber As Long
Dim template As String
Dim i As Integer

' Generate a temporary filename
i = 0
Do
ShellCmdPath = Hex(i) & ".bat"
i = i + 1
Loop While Len(Dir(ShellCmdPath)) > 0

' Prepare batch file content
template = "@echo off" & vbCrLf

' Action to execute
template = template & PathName & vbCrLf

' Remove created batch file when action has been executed
template = template & "del " & ShellCmdPath

' Create batch file
FileNumber = FreeFile
Open ShellCmdPath For Output As #FileNumber
Print #FileNumber, template
Close #FileNumber

' Execute batch file containing action
Shell ShellCmdPath, WindowsStyle

' Wait for asynchronous command to finish
While Len(Dir(ShellCmdPath)) > 0
DoEvents
Wend
End Sub
Messages postés
70
Date d'inscription
dimanche 11 janvier 2004
Statut
Membre
Dernière intervention
1 octobre 2004

Chapeau pour ce petit bout de code, qui aurait pu être, et même du être, un argument Wait dans le Shell de base de VB.

Thx pour cela, et sinon je m'en sers dans une appli pour un controle de raccourci de Jeu.
(Tu clique le programme charge l'image cd et lance l'executable, en clair ton jeu démarre sans avoir besoin de faire d'opérations chiantes.Et dans cela il sert à protéger contre la double-execution du jeu par simple bascule)

Bonne continuation.
Messages postés
1
Date d'inscription
jeudi 2 mars 2006
Statut
Membre
Dernière intervention
27 octobre 2006

Merci beaucoup !
Ton code m'a sauvé la vie ...
Surtout par sa facilité d'intégration
Messages postés
46
Date d'inscription
samedi 1 mars 2003
Statut
Membre
Dernière intervention
16 septembre 2008

Pas mal je m'en sers pour faire des mises à jours de mon logiciel sans que l'utilisateur puisse continuer à utiliser ou installer ou configurer le reste...
Messages postés
248
Date d'inscription
jeudi 3 février 2005
Statut
Membre
Dernière intervention
22 juin 2008

Super, c'est pratique moi je l'utilise comme sa :
do
doevents
shellwait "notepad.exe"
loop

Comme sa on peut pas fermer le bloc-note ...
Tres bonne source je met 10/10
Afficher les 30 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.