Newsgroup: it.comp.lang.visual-basic
Titolo: Shell DOS, quando termina?

Salve,
Sto cercando di conoscere quando un programma avviato in una shell termina
l'esecuzione.
Ho visitato e copiato scaricato dal WEB
www.murialdo.it:8000/perle/articoli/vb_e_shell_dos/Articolo.htm
l'articolo di Bruno Salzano, che ne approfitto per ringraziare pubblicamente
e che legge questo messaggio in copia personale, per il suo articolo molto
curato e preciso.
Ho seguito il suo esempio come segue:
Dim Wbuffer As String * 145
Wbuffer = String(256, 0)
maxsize = Len(Wbuffer)
Call GetWindowText(Handle, Wbuffer, maxsize)            '<<<<<<<<<<<<<
TitoloFinestra = StrNulToStr(Wbuffer, maxsize)
Do
  DoEvents
  If InStr(1, UCase(TitoloFinestra), "ESECUZIONE TERMINATA") > 0 Then
    Exit Do
  End If
Loop
End Function
Function StrNulToStr(ByVal Str_Nul$, ByVal Size As Long) As String
Dim k, SizeKont As Long
SizeKont = Size
If Size = 0 Then SizeKont = 256
For k = 1 To SizeKont
If Asc(Mid(Str_Nul$, k, 1)) = 0 Then Exit For
StrNulToStr = StrNulToStr + Mid(Str_Nul$, k, 1)
Next k
End Function
ma quando compilo il programma ottengo una text box con
"Errore di compilazione. Sub o Function non definita"
su Call GetWindowText.
Sarà un momento di smarrimento ma non riesco a capire;
GetWindowText è di sistema?? Dove si trova??
Grazie in anticipo.
Saluti
Leo

La GetWindowText è un'API...
RiK

ti serve una funzione che ti dica quando una shell è terminata???
Se dimmelo che te la mando: ne ho io una pronta!!!

...


ecco a te la routine!!
Fammi però sapere se ti è stata utile!!
Un salutone Leonardo!!!
Rita
******QUESTA E' LA DICHIARAZIONE******
Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA"
(ByVal lpModuleName As String) As Long
******QUESTA E' LA FUNZIONE CHE USO IO******
Sub sub0EseguiShell(Comando As String)
    ' Esegue un comando DOS in modo SINCRONO --------------
    '
    ' N.B.: Se il comando e' un .PIF , il file .PIF deve
    '       avere come Titolo Finestra la stessa stringa
    '       passata come parametro a questa subroutine.
    Dim hModule As Integer, hWnd As Integer
    Dim I As Long
    hModule = Shell(Comando, 2)             ' attiva il comando
    Do While GetModuleHandle(hModule) > 0    ' se instance attiva ...
        DoEvents                            ' ... rilascia controllo ...
    Loop
End Sub
******COSI' LA RICHIAMO******
  sub0EseguiShell (nomeShell)
CIAO CIAO!!!!!

Saluti
Io uso questa che può essere estesa a qualunque programma da eseguire in
modo sincrono
'****************************
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
Public Const SYNCHRONIZE = &H100000
Public Const STILL_ACTIVE = &H103
Public Const PROCESS_QUERY_INFORMATION = &H400
Public Const ERROR_FILE_NOT_FOUND = 2&
Public Sub execBatchModule(cmdBatch as String)
    'utilizza le API di WIN per attendere la fine del processo
    Dim hInstance As Long
    Dim hProcess As Long
    Dim lngRetval As Long
    Dim lngExitCode As Long
    hInstance = Shell(cmdBatch, vbMinimizedNoFocus) 'minimizzata ma si
possono utilizzare altre costanti
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or SYNCHRONIZE, True,
hInstance)
    Do
        lngRetval = GetExitCodeProcess(hProcess, lngExitCode)
        DoEvents
    Loop While lngExitCode = STILL_ACTIVE
End Sub

(ByVal lpModuleName As String) As Long
Ho una buona esperienza in QBasic 4.5 ed č la prima volta, mio malgrado, che
sto realizzando un programma abbastanza complesso in ambiente WIN e non in
una finestra DOS.  Finora ho realizzato procedure e programmi con il caro e
vecchio DOS e non ho mai avuto seri problemi.
Tornando alla Declare, ovunque la posizioni nel mio programma mi da errore
(sembra che non la voglia nessuno).
Se la metto  nella Sub form_load mi da errore!
Se la metto nelle dichiarazioni generali, mi viene segnalato che non č
ammessa come membro Public di modulo oggetto..
Dove la metto??
Grazie in anticipo della risposta.
Saluti
Leonardo

Ciao Salvatore,
Ti ringrazio della routine. E' la seconda  volta che tento di usare un'API e
non ho ben capito dove inserire le due Declare. In pratica credo sia lo
stesso problema che ho segnalato a Rita nello stesso tread.
Ho una buona esperienza in QBasic 4.5 ed č la prima volta, mio malgrado, che
sto realizzando un programma abbastanza complesso in ambiente WIN e non in
una finestra DOS.  Finora ho realizzato procedure e programmi con il caro e
vecchio DOS e non ho mai avuto seri problemi, ma da adesso...
Tornando alle Declare, ovunque la posizioni nel mio programma mi da errore
(sembra che non le voglia nessuno).
Se le metto  nella Sub form_load mi da errore!
Se le metto nelle dichiarazioni generali, mi viene segnalato che non č
ammessa come membro Public di modulo oggetto..
Dove la metto??
anche
Public Const SYNCHRONIZE = &H100000
Public Const STILL_ACTIVE = &H103
Public Const PROCESS_QUERY_INFORMATION = &H400
Public Const ERROR_FILE_NOT_FOUND = 2&
le le segnala in rosso.
Puoi aiutarmi??


Puoi aiutarmi??
Off Course ! ^__^
La decleare la puoi mettere in generale (dichiarazioni)
solo facendola precedere dalla keyword "Private"
(Es: Private Declare Pincopalla.....ecc...ecc...)
Idem per le costanti.
(Es: Private Const SYNCHRONIZE = &H100000)
Oppure, usi la keyvord "Public" e metti il tutto in un
file modulo (estensione .BAS)
Bye,
Zeross


Come ha già risposto Zeross in un modulo .bas
Ciao Salvatore

>


    hModule = Shell(Comando, 2)             ' attiva il comando
e la richiamo così:
Esecuzione = "c:\Adr\" + Directory + "\vai.pif"
sub0EseguiShell (Esecuzione)
dove ho sbagliato??
Ciao
Leonardo

Ciao Salvatore,
ho provato a usare la Tua funzione. Non da errori, ma purtroppo nel loop si
ferma per tutta la durata della shell.
Per tracciare un pò il programma la sub l'ho modificato come segue:
Public Sub execBatchModule(cmdBatch As String)
    'utilizza le API di WIN per attendere la fine del processo
    Dim hInstance As Long
    Dim hProcess As Long
    Dim lngRetval As Long
    Dim lngExitCode As Long
    hInstance = Shell(cmdBatch, vbMinimizedNoFocus) 'minimizzata ma si
possono utilizzare altre costanti
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or SYNCHRONIZE, True,
hInstance)
     frmActiv.Text1.Text = "hProcess=" + Str(hProcess)
    Do
        lngRetval = GetExitCodeProcess(hProcess, lngExitCode)
        DoEvents
         frmActiv.Text1.Text = frmActiv.Text1.Text + "-" + Str(lngRetval) +
Str(lngExitCode)
    Loop While lngExitCode = STILL_ACTIVE
End Sub
e in frmActiv.Text1.Text  ottengo:
hProcess= 316- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1 259- 1
259- 1 259- 1 259- 1 259- 1 259- 1 0
Quando compare lo 0 inizia l'esecuzione del programma nella shell e il Main
prosegue...
Puoi aiutarmi???
Saluti
cacci...@bigfoot.com
Leonardo

Ciao Salvatore,
ho tentato di inviarti una e-mail privata ma il tuo indirizzo č stato
rigettato.
Potresti, se ti fa piacere, inviarmi la Tua e-mail al mio indirizzo??
cacci...@bigfoot.com
Saluti
Leonardo