Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] Lanciare un'applicazione e notifica chiusura

Salve,
vorrei poter lanciare un'applicazione esterna da vb, in modalità asincrona, ma essere notificato della sua eventuale chiusura o poterla comunque terminare in 
qualsiasi momento.
Il comando shell permette di eseguirla, ma non di fermarla o di essere notificati quando questa termina.
Posso farlo semplicemente con chiamate di sistema o magari tramite un ocx?
Grazie
JB

Recupera il PID o l'HWND, quindi se non avvi un sistema di controllo su
Timer
e verifichi che sia ancora aperto con IsWindow oppure ciclando i
processi e
controllando sia ancora presente non puoi inventare molto....!!!
Per chiuderlo invece puoi usare le Api sempre con la terminazione di un
processo
oppure con WMI ed il metodo Terminate sul PID in questione.
@Alex

Aaaaalt, ce la fai !
Ce la fai con l'API 
WaitForSingleObject   
usando il parametro   INFINITE
cerca il nome della API su Internet e troverai esempi su questo


Il comando shell permette di eseguirla, ma non di fermarla o di essere notificati quando questa termina.
Prova a usare SuperShell:
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=449&lngWId=1
--
ciao
  Stefano

 Posso farlo semplicemente con chiamate di sistema o magari tramite un ocx?
Per fare tutto quello che vuoi fare tu, in modo semplice e pulito: MSDN, 
cerca CreateProcess e leggiti tutta la sezione. Spiega come mettere in pausa 
un processo e come aspettarne l'esecuzione.

Ho capito male io o diceva ASINCRONA....?
In tal caso deve essere svincolata e non bloccare il codice
in esecuzione....!
Stà di fatto quindi che non è possibile controllarlo in questo modo.
Se invece ho capito male tutte le vostre soluzioni sono equivalenti e
corrette.
@Alex

 Stà di fatto quindi che non è possibile controllarlo in questo modo.
Beh... non è possibile direttamente ed in maniera facile. Ci vuole un thread
secondario, cosa un po' ostica da ottenersi in VB6.
Infatti inserendo il meccanismo di creazione processo ed attesa
completamento in un componente multithreaded con le tecniche spiegate qui
http://www.freevbcode.com/ShowCode.asp?ID=1287
http://www.fawcette.com/Archives/premier/mgznarch/vbpj/1999/06jun99/cb0699.pdf
e soprattutto qui
http://www.fawcette.com/archives/premier/mgznarch/vbpj/1999/06jun99/bb0699.pdf
secondo me è difficile ma non è impossibile, anzi, forse qualcun altro ci ha
già pensato e ha sviluppato una DLL (o un OCX).
Ma magari nello specifico il gioco non vale la candela... e allora vai pure
di timer come hai giustamente suggerito.
Bye
Raf

io ho suggerito WaitForSingleObject per la notifica
che mi era parso fosse la parte della questione che gli mancasse.
Come dice la parola Wait poi sicuramente c'è attesa.
Ma nel caso della continuazione non potrebbe isolare
WaitForSingleObject andandolo a mettere nel timer, 
togliendolo da davanti quel codice che vuole essere eseguito... ? 


a che scopo...?
Avendo aperto un Processo, mi basta nel timer verificare che sia ancora
attivo.
Rafunk ha pubblicato dei link che danno un'alternativa tecnica
complessa
alla faccenda, cosa alla quale non avevo nemmeno pensato, ma volendo
rimanere in ambito VB6 con poche righe da scrivere non sono mai
dell'idea
di complicarmi la vita se non serve.
@Alex

Perchè "complicarsi la vita" ?
Quell' API (pure semplice) è fatta per quello.
E se vuoi l'asincronismo la chiami dal timer (occorre una riga solo).
E basta (sempre secondo le mie conoscenze).


 E basta (sempre secondo le mie conoscenze).
Ti ricordo che VB6 è single-thread.
Ciao 

Ti ricordo che VB6 č single-thread.
Sě lo so,
ma sono andato a prendere del codice che avevo
e vi riporto sotto l'esempio che ho detto
che si appoggia al timer
(se volete provarlo...) 
Su un Form
mettete 2 Command e 1 Timer 
ed incollate questo:
'----------------------------------------------
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal _
   hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal _
   dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal _
   MioProcessoID As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject _
   As Long) As Long
Private Const SYNCHRONIZE = &H100000
Dim MioProcessoHANDLE As Long
Dim risultato As Long
Private Sub Command1_Click()
    Dim MioProcessoID As Long
    MioProcessoID = Shell("Notepad", 1)
    MioProcessoHANDLE = OpenProcess(SYNCHRONIZE, False, MioProcessoID)
 
 
    Timer1.Enabled = True
End Sub
Private Sub Command2_Click()
MsgBox risultato
If risultato = 0 Then
    Timer1.Enabled = False
    CloseHandle MioProcessoHANDLE
End If
End Sub
Private Sub Form_Load()
    Command1.Caption = "Apri Notepad"
    Command2.Caption = "Situazione Notepad"
 
    Timer1.Enabled = False
    Timer1.Interval = 1000
End Sub
Private Sub Timer1_Timer()
        risultato = WaitForSingleObject(MioProcessoHANDLE, 100)
        DoEvents
End Sub