Newsgroup: it.comp.lang.visual-basic
Titolo: Come lanciare un'app. con attesa?

Ho visto che la funzione shell permette di lanciare applicazioni esterne, e
mi sta bene.
Come si puo' fare per sapere se detta applicazione e' terminata?
Vi prego aiutatemi sono nella m___a!!!
-- 
Gabriele Ponzo
gpo...@wnet.it
http://www.wnet.it/gponzo

Gabriele Ponzo ha scritto nel messaggio
<01bd7cce$c9aff0e0$LocalHost@pcgponzo>...

Prova in questo modo:
Declare Function GetModuleUsage Lib "Kernel" (ByVal hModule%) As Integer
 x% = Shell(Programma, 1)                        ' Lancia il programma
 While GetModuleUsage(x%) > 0             ' cicla fino a che è terminato
        z = DoEvents()
 Wend
ciao ciao...

La funzione GetModuleUsage va benissimo (piu' o meno, da qualche problema di
overflow ma e' l'unica)  se si resta in ambiente 16 bit, ma è stata
cancellata nel VB5. Ho avuto anche io dei problemi che ho risolto spulciando
nell' "alveare" di API che possiede Windows e creando una funzione che
sfrutta due di esse:
-in fase di dichiarazione
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
- Questa e' la funzione da me creata (cioe' e' un collage di varie funzioni)
'La funzione restituisce true o false a seconda se e' andata a buon fine o
meno
Function Attendi(ProcessID As Long) As Boolean
On Error GoTo ErrAttendi
    Dim ProcessHandle As Long
    Dim ExCode As Long
    Dim oldExCode As Long
'Memorizzo l'handle del processo aperto
    ProcessHandle = OpenProcess(1, 0, ProcessID)
'Richiamo una prima volta la funzione di controllo per
'avere il codice che identifica il programma quando è attivo
    GetExitCodeProcess ProcessHandle, ExCode
    oldExCode = ExCode
'Ciclo fino a quando l'ExCode non cambia, e quindi significa che
'il programma sotto controllo è terminato
    While oldExCode = ExCode
        GetExitCodeProcess ProcessHandle, ExCode
    Wend
    Attendi = True
Exit Function
ErrAttendi:
    Attendi = False
    MsgBox Err.Description & " nella funzione Attendi", vbExclamation
End Function
-Nel codice questa funzione puo' essere usata cosi'
Private Sub Command2_Click()
Dim id As Long
    id = Shell("C:\windows\sol.exe", vbMaximizedFocus)
    If Attendi(id) Then
        id = Shell("C:\windows\winmine.exe", vbMaximizedFocus)
    End If
End Sub
Spero di esserti stato d'aiuto e se per caso ti accorgi che c'e' qualche
baco ti prego di avvisarmi!!! :-)
         Eclisse


>Come si puo' fare per sapere se detta applicazione e' terminata?
Questi sono i "consigli ufficiali":
HOWTO: 32-Bit App Can Determine When a Shelled Process Ends
Last reviewed: April 27, 1998
Article ID: Q129796
The information in this article applies to:
Standard, Professional, and Enterprise Editions of Microsoft Visual Basic,
32-bit only, for Windows, version
http://www.microsoft.com/kb/articles/q129/7/96.htm
Buon lavoro!
        Stefano Procenzano
 
http://web.uol.it/personal/procstef
_________________________________________________
"Un grande albero cresce da un piccolo germoglio,
 un lungo cammino inizia da un piccolo passo"