Newsgroup: it.comp.lang.visual-basic
Titolo: ATTESA FINE PROCESSO

Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle
As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwAccess As Long,
ByVal fInherit As Integer, ByVal hObject As Long) As Long
Sub ShellWait(cmdline As String)
    Dim retval As Long, pID As Long, pHandle As Long
    pID = Shell(cmdline, vbHide)
    pHandle = OpenProcess(&H100000, True, pID)
    retval = 1
    Do While retval <> 0
       DoEvents
       retval = WaitForSingleObject(pHandle, 0)
    Loop
End Sub
Uso queste istruzioni per attendere la fine del processo.
Su win2000 funziona bene mentre su win98 va' il loop il ciclo DO WHILE.

 ha scritto nel messaggio
news:3A84e.44367$zZ1.1...@twister1.libero.it...

Non usare WaitForSingleObject ma GetExitCodeProcess:
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As
Long, lpExitCode As Long) As Long
Const STILL_ACTIVE = &H103&
Const PROCESS_ALL_ACCESS = &H1F0FFF
Dim iExit   As Long
        ...
        pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pID)
        GetExitCodeProcess pHandle, iExit
        Do While iExit = STILL_ACTIVE
            DoEvents
            GetExitCodeProcess pHandle, iExit
        Loop
Bye
Un tuo ...omonimo
Raf

grazie per la risposta.
Volevo dirti che con il 98 va in loop lo stesso.
Ho trovato qualcosa nel sito comune. Funziona.
L'unico inconveniente e' nascondere la finestra del prompt di msdos.
Ho provato a settare la proprieta' wShowWindow ma niente da fare.

 Ho provato a settare la proprieta' wShowWindow ma niente da fare.
E te lo tieni cosi' finche' non definisci il "qualcosa" :-P
--
ciao, hal.cheseimparassimoadanalizzareiproblemisarebbemeglio
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 ha scritto nel messaggio
news:XSa4e.44809$zZ1.1...@twister1.libero.it...

Ah... ma non avevi specificato che il processo da lanciare era un comando DOS!
Per forza allora non esce dal loop, infatti con Win98 se per default non č
impostato "Chiudi all'uscita" per la finestra DOS, il processo a cui essa
appartiene (e che č quello ispezionato nel loop) non termina quando termina
l'esecuzione del comando.
Posta il codice che si inlooppa dopo aver incorporato il "qualcosa" trovato sul
sito comune.
Bye
Raf

 sito comune.
Option Explicit
Public Type STARTUPINFO
        cb As Long
        lpReserved As String
        lpDesktop As String
        lpTitle As String
        dwX As Long
        dwY As Long
        dwXSize As Long
        dwYSize As Long
        dwXCountChars As Long
        dwYCountChars As Long
        dwFillAttribute As Long
        dwFlags As Long
        wShowWindow As Integer
        cbReserved2 As Integer
        lpReserved2 As Long
        hStdInput As Long
        hStdOutput As Long
        hStdError As Long
        End Type
        Public Type PROCESS_INFORMATION
        hProcess As Long
        hThread As Long
        dwProcessID As Long
        dwThreadID As Long
End Type
Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As
Long, ByVal dwMilliseconds As Long) As Long
Public Declare Function CreateProcessA Lib "kernel32" (ByVal _
        lpApplicationName As Long, ByVal lpCommandLine As String, ByVal _
        lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _
        ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
        ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, _
        lpStartupInfo As STARTUPINFO, lpProcessInformation As _
        PROCESS_INFORMATION) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal _
        hObject As Long) As Long
Public Const NORMAL_PRIORITY_CLASS = &H20&
Public Const INFINITE = -1&
Public Sub ShellAndWait(ByVal RunProg As String)
    Dim RetVal As Long
    Dim proc As PROCESS_INFORMATION
    Dim StartInf As STARTUPINFO
     StartInf.cb = Len(StartInf)
    'Crea sessione del programma da lanciare
    RetVal = CreateProcessA(0&, RunProg, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS,
0&, 0&, StartInf, proc)
    RetVal = WaitForSingleObject(proc.hProcess, INFINITE)
    RetVal = CloseHandle(proc.hProcess)
End Sub
il comando dos che lancio e'        "  c:\zip.exe -j c:\t.zip c:\d.txt "
appena apre la finestra dos aspetta l'invio per terminarla.

 appena apre la finestra dos aspetta l'invio per terminarla.
Innanzitutto per far sì che CreateProcess consideri il campo wShowWindow occorre
che il campo dwFlag contenga STARTF_USESHOWWINDOW (=1)
Const STARTF_USESHOWWINDOW = &H1
StartInf.dwFlags = STARTF_USESHOWWINDOW
Però la sostanza non cambia: la finestra DOS non si chiude, il processo non
termina, ergo la WaitForSingleObject non esce.
In analoghe situazioni, peraltro rarissime, avevo risolto con un bat contenente
i comandi + un file .pif ad esso associato, con la proprietà "chiudi
all'uscita".
Ciao
Raf

 proprietą "chiudi all'uscita".
Funziona anche un bat con un "exit" alla fine, se non ricordo male.
Bye, G.