Migliorare la funzione di Shell

La funzione Shell del VB permette l'esecuzione di altri applicativi dal proprio programma.
Questa funzione però dà per scontato che stiate mandando in giro un applicativo figlio per svolgere qualche compito in modo indipendente e che non vi interessi più quello che fa.
Se il vostro programma dipende dai risultati dell'applicativo figlio, dovreste svolgere un po' di lavoro in più per stabilire quando l'applicativo è terminato.
In generale i programmi scritti per Windows girano in modo asincrono, cioè contemporaneamente ad altri applicativi senza preoccuparsi minimamente di quello che gli altri applicativi stanno facendo.
Per eseguire gli applicativi in modo sincrono, cioè eseguire un applicativo ed aspettare che esso sia terminato prima di procedere con altre operazioni, utilizzando la funzione shell si dovrà scrivere qualche linea di codice in più. La documentazione del VB dice che Shell restituisce un identificativo di task dell'applicativo avviato, utilizzando le funzioni
API OpenProcess, CloseHandle, WaitForSingleObject e l'identificativo di task è possibile fare in modo che il programma attenda che l'applicativo eseguito sia terminato prima di procedere:

Dim hPrg As Long
Dim hProc As Long
Dim iRet As Long
hPrg = Shell("Word.Exe")
hProc = OpenProcess(PROCESS_ALL_ACCESS, False, hPrg)
If hProc <> hNull Then
IRet = WaitForSingleObject(hproc, INFINITE)
CloseHandle hProc
End If

Spesso però non si vuole stare ad aspettare senza far nulla, ma si vuole sapere quando l'applicativo eseguito ha finito. Questo lo si può fare utilizzando la funzione API GetExitCodeProcess:

Dim hPrg As Long
Dim hProc As Long
Dim iRet As Long
hPrg = Shell("Word.Exe")
hProc = OpenProcess(PROCESS_ALL_ACCESS, False, hPrg)
If hProc <> hNull Then
GetExitCodeProcess hProc, iRet
If iRet = STILL_ACTIVE Then
' applicazione ancora in esecuzione
End If
End If

Testato su: Windows 98, Windows Me, xxxxxxxxxx