Newsgroup: it.comp.lang.visual-basic
Titolo: shellexecute

Salve a tutti,
Eseguo un file .exe DOS con l' API shellexecute, qualcuno sa come attendere
che il file termini prima di proseguire. Visto che crea un file di log se lo
leggo subito dopo lo trovo incompleto !!!!
Non esiste un API di win che verifica se esiste un processo?
HelpMe!!
Lorenzo

Per quello che ne so' è impossibile (ne parlavo proprio ieri con un
amico)... a meno che tu non imposti uno sleep, praticamente dopo la chiamata
shell metti sleep(es.2000)  e vedrai che il file diventa completo.
Il problema risiede nel fatto che la shell nasce per natura con impostazione
di non-attesa rispetto a VB.
In alternativa potresti provare con una gestione del tipo if fileexist
log.txt then avanti altrimenti loppa finche il file log esiste.
ciao
                             _pixel_

 che il file termini prima di proseguire.
Io ho usato un metodo poco elegante ma funzionante.
Crei un file .bat che chiama l'exe, fa tutto quello che deve fare e alla
fine metto un
    echo finito>finito.tmp
Nel programma in VB:
    If Not Dir("finito.tmp") = "" Then Kill "finito.tmp"
    Shell "daeseguire.bat"
    Do While Dir("finito.tmp")=""
      DoEvents
    Loop
    Kill "finito.tmp"
Ignazio

....prova con
Public Declare Function WaitForSingleObject Lib "kernel32.dll" (ByVal
hHandle As Long, ByVal _
	dwMilliseconds As Long) As Long
Public Const WAIT_TIMEOUT = &H102
Do
    DoEvents
    retval = WaitForSingleObject(*XXXX*.hProcess, 0) 'dove XXXX è la
variabile di tipo *SHELLEXEXECUTE*
Loop While retval = WAIT_TIMEOUT


http://www.it-lang-vb.net
Cerca shell... ;-)


Liberamente tratto dalla Api-Guide. Copia incolla su un progetto vuoto.
Occhio che l'attesa non restituisce il controllo al programma principale
neanche per il refresh grafico. In ogni caso esiste anche un'altro
sistema che permette di attendere la fine del processo lasciando pero'
il controllo a VB (solo che ora non ce l'ho sotto mano... basta cercare
;) )
***** BEGIN SNIPPET *****
Option Explicit
Const INFINITE = &HFFFF
Const STARTF_USESHOWWINDOW = &H1
Private Enum enSW
   SW_HIDE = 0
   SW_NORMAL = 1
   SW_MAXIMIZE = 3
   SW_MINIMIZE = 6
End Enum
Private Type PROCESS_INFORMATION
   hProcess As Long
   hThread As Long
   dwProcessId As Long
   dwThreadId As Long
End Type
Private 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 Byte
   hStdInput As Long
   hStdOutput As Long
   hStdError As Long
End Type
Private Type SECURITY_ATTRIBUTES
   nLength As Long
   lpSecurityDescriptor As Long
   bInheritHandle As Long
End Type
Private Enum enPriority_Class
   NORMAL_PRIORITY_CLASS = &H20
   IDLE_PRIORITY_CLASS = &H40
   HIGH_PRIORITY_CLASS = &H80
End Enum
Private Declare Function CreateProcess Lib "kernel32" Alias
"CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine
As String, lpProcessAttributes As SECURITY_ATTRIBUTES,
lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As
Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal
lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO,
lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal
hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Function SuperShell(ByVal App As String, ByVal WorkDir As
String, dwMilliseconds As Long, ByVal start_size As enSW, ByVal
Priority_Class As enPriority_Class) As Boolean
   Dim pClass As Long
   Dim sInfo As STARTUPINFO
   Dim pInfo As PROCESS_INFORMATION
   'Non utilizzato ma necessario
   Dim Sec1 As SECURITY_ATTRIBUTES
   Dim Sec2 As SECURITY_ATTRIBUTES
   'Imposta la dimensione della struttura
   Sec1.nLength = Len(Sec1)
   Sec2.nLength = Len(Sec2)
   sInfo.cb = Len(sInfo)
   'Imposta i flags
   sInfo.dwFlags = STARTF_USESHOWWINDOW
   'Imposta la posizione di avvio della finestra
   sInfo.wShowWindow = start_size
   'Imposta la Priority_Class
   pClass = Priority_Class
   'Avvia il programma
   If CreateProcess(vbNullString, App, Sec1, Sec2, False, pClass, _
                     0&, WorkDir, sInfo, pInfo) Then
      'Attende il tempo specificato
      WaitForSingleObject pInfo.hProcess, dwMilliseconds
      SuperShell = True
   Else
      SuperShell = False
   End If
End Function
Private Sub Form_Load()
    SuperShell "Notepad.exe", "C:\", 0, SW_NORMAL, HIGH_PRIORITY_CLASS
    MsgBox "Finito"
End Sub
***** END SNIPPET *****
Happy Coding =)
Lokar

 ha scritto nel messaggio
news:GX2H8.26$TM1...@nreader1.kpnqwest.net...
