Newsgroup: it.comp.lang.visual-basic
Titolo: [???] Ma non lo sa nessuno?!

>solo per win16.
Su MSDN, articolo Q129796, e' indicato il modo per lanciare ed aspettare un programma.
Se nella WaitForSingleObject metti un timeout anziche' INFINITE puoi sapere se e' terminato (credo).
Antonio

"Antonio Donatiello" <ant...@REMOVETHISgeminisoft.com> ha scritto

Non conosco la risposta ma facciamo insieme queste considerazioni:
il valore di ritorno di Shell e' l'ID del processo. Puoi aprire un processo
sincronizzato con questo mediante OpenProcess che restituisce l'handle del
processo o 0 in caso di errore, quindi mediante un timer puoi aprire (e
chiudere con CloseHandle) fino a che OpenProcess non ritorna 0.
Private Const SYNCHRONIZE As Long = &H100000
Private Declare Function OpenProcess& Lib "kernel32" ( _
    ByVal dwDesiredAccess& _
  , ByVal bInheritHandle& _
  , ByVal dwProcessId& _
  )
Private Declare Function CloseHandle& Lib "kernel32" ( _
  ByVal hObject& _
  )
--
Ciao.
Maurizio

>chiudere con CloseHandle) fino a che OpenProcess non ritorna 0.
Mi sembra che Shell non vada bene in questo caso. Se non ricordo male un mio collega mi aveva detto che il valore di ritorno non e' corretto. Bisogna usare CreateProcess come descritto in quell'articolo a cui facevo riferimeno nel precedente messaggio.
Antonio

quell'articolo a cui facevo riferimeno nel precedente messaggio.
Puo' darsi. Percio' ho provato a verificare con questo codice e,
apparentemente, funziona. Non so se e' corretto o meno o se ci sono casi
particolari o che altro. Vuoi provare anche tu?
Option Explicit
Private Const SYNCHRONIZE As Long = &H100000
Private Declare Function OpenProcess& _
  Lib "kernel32" ( _
    ByVal dwDesiredAccess& _
  , ByVal bInheritHandle& _
  , ByVal dwProcessId& _
  )
Private Declare Function CloseHandle& _
  Lib "kernel32" ( _
  ByVal hObject& _
  )
Private lm_ProcID As Long
Private Sub Command1_Click( _
)
  With Me
    .Command1.Enabled = False
    lm_ProcID _
      = Shell("calc.exe", vbNormalFocus)
    .Timer1.Interval = 1000
  End With
End Sub
Private Sub Timer1_Timer( _
)
Dim l_ProcHnd
  If lm_ProcID Then
    l_ProcHnd _
      = OpenProcess(SYNCHRONIZE, 0&, lm_ProcID)
    If l_ProcHnd Then
      CloseHandle l_ProcHnd
    Else
      With Me
        .Timer1.Interval = 0
        .Command1.Enabled = True
      End With
      Beep
    End If
  End If
End Sub
--
Ciao.
Maurizio

 via Mailgate.ORG Server - 
http://www.mailgate.org

>particolari o che altro. Vuoi provare anche tu?
Non ho tempo di provare. Nell'articolo citato dice chiaramente di usre CreateProcess anziche' Shell. Infatti shell torna il task id mentre CreateProcess torna il process id che serve poi per sapere se il processo termina.
Antonio

Provate ad utilizzare FindWindows(lpClassName, lpWindowName)  l'unica cosa che bisogna trovare uno spy che ti dica qual'è la classe del programma che hai lanciato con Shell
La declare è la seguente:
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Il codice:
Do While FindWindow(lpClassName, lpWindowName) <> 0
      DoEvents
Loop
Antonio Donatiello ha scritto:

--

 Loop
Credo che l'articolo Q129796 della KB citato ieri da Antonio Donatiello (o,
per una implementazione piu' veloce, il codice postato da me, la cui
affidabilita' andrebbe pero' testata) siano una risposta corretta al
quesito.
--
Ciao.
Maurizio

 Dim l_ProcHnd
Mi correggo:
  Dim l_ProcHnd As Long
--
Ciao.
Maurizio