Eseguire programmi esterni
Vi e` mai capitato di dover lanciare un eseguibile esterno al vostro programma e volerne attendere la fine dell'esecuzione prima di proseguire quella del vostro? Se usate la funzione Shell di VB vi accorgerete che non e` possibile: l'esecuzione e` asincrona ed il vostro programma continua a girare subito dopo aver lanciato l'eseguibile esterno. Soluzione: inserite queste linee di codice in un modulo ed usate la funzione RikShell al posto della normale Shell di VB.

Option Explicit
'RikShell - by Rik 8/5/98

'Come funzione Shell, ma il programma VB resta
'in attesa che il programma lanciato termini.

Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hprocess As Long, _lpExitCode As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Const STILL_ACTIVE = &H103
Const PROCESS_QUERY_INFORMATION = &H400
'

Function RikShell(exe As String, Optional WinStyle) As Integer
Dim processid As Long
Dim hprocess As Long
Dim exitcode As Long
Dim parm As Integer

'Controllo il parametro opzionale finestra
Select Case VarType(WinStyle)
  Case vbEmpty, vbNull, vbError
   parm = vbNormalFocus
  Case vbLong, vbInteger, vbSingle, vbDouble
   parm = WinStyle
  Case Else
   parm = vbNormalFocus
End Select

'Prelevo l'ID del processo lanciato
processid = Shell(exe, parm)
'Creo un Handle per quel processo
hprocess = OpenProcess(PROCESS_QUERY_INFORMATION, False, processid)
Do
 'Controllo ripetutamente che termini
 Call GetExitCodeProcess(hprocess, exitcode)
 'Lascio libero il sistema di processare le altre
 'applicazioni
 DoEvents
 Loop While (exitcode = STILL_ACTIVE)
 CloseHandle (hprocess)

End Function


Esempio di uso da un pulsante sopra un Form

Option Explicit

Private Sub cmdLancio_Click()
 RikShell "notepad.exe"
End Sub

Riccardo Bartolini