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