Newsgroup: it.comp.lang.visual-basic
Titolo: Lanciare un .exe esterno... sarò scemo...

Salve a tutti, sto cercando una soluzione che ovviamente sarà banale ma
che proprio non riesco a trovare: devo farmi un programmino infimo che
lanci una applicazione esterna (è il programma vero e proprio, scritto
anch'esso in VB) e che, rimanendo attivo, controlli che tale applicazione
sia sempre attiva. In caso non sia attiva la deve lanciare.
Credo siano 10 righe di codice al massimo, ma ... come diavolo si lancia
un .exe all'interno di un programma VB 6.0 ?!? Ho cercato in quel marasma
della guida di Visual Studio un qualsiasi Call, Run, Launch ... nulla... 
Grazie per l'aiuto!
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 lancia un .exe all'interno di un programma VB 6.0 ?!?
shell
--
Salutoni
Sergio

 shell
Thank you ... l'avevo trovato poi, stavo per scrivere ... ma la domanda
sorge spontanea: come posso far aspettare il programma chiamante fino a
che l'altra applicazione viene chiusa (o si chiude?)
Grazie...



Per controllare che l'applicazione sia in esecuzione devi usare le API di
Windows.
Lanci l'applicazione con la funzione CreateProcessBynum e ne controlli lo
stato con la funzione WaitForSingleObject.
Esempio:
    Const INFINITE = &HFFFF
    Const NORMAL_PRIORITY_CLASS = &H20
    Const WAIT_TIMEOUT = &H102&
    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 Long
      hStdInput As Long
      hStdOutput As Long
      hStdError As Long
    End Type
    Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As
Long
    Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As
Long, ByVal dwMilliseconds As Long) As Long
    Declare Function CreateProcessBynum Lib "kernel32" Alias
"CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As
String, ByVal lpProcessAttributes As Long, ByVal lpThreadAttributes As Long,
ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment
As Any, ByVal lpCurrentDirectory As String, lpStartupInfo As STARTUPINFO,
lpProcessInformation As PROCESS_INFORMATION) As Long
    Declare Function WaitForInputIdle Lib "user32" (ByVal hProcess As Long,
ByVal dwMilliseconds As Long) As Long
    Dim Res As Long, sInfo As STARTUPINFO, pInfo As PROCESS_INFORMATION
  Public Sub Main()
    sInfo.lpReserved = vbNullString
    sInfo.lpDesktop = vbNullString
    sInfo.lpTitle = vbNullString      'eventuale titolo della finestra
    sInfo.dwFlags = 0                   'permette di specificare la modalità
di visualizzazione del programma lanciato
    sInfo.cb = Len(sInfo)
    Res = CreateProcessBynum("", "C:\MyDirectory\MyApplication.exe", 0, 0,
True, NORMAL_PRIORITY_CLASS, ByVal 0&, vbNullString, sInfo, pInfo)
    If Res <> 0 Then
        Call WaitForInputIdle(pInfo.hProcess, INFINITE)
        Call CloseHandle(pInfo.hThread)
        Do
            DoEvents   'opzionale
            Res = WaitForSingleObject(pInfo.hProcess, 0)
        Loop While Res = WAIT_TIMEOUT     '<<<<<<< CICLA FINCHE' IL PRG E'
IN ESECUZIONE
        Call CloseHandle(pInfo.hProcess)
    End If
End Sub

 chiamante fino a che l'altra applicazione viene chiusa (o si chiude?)
siccome la risposta eccede le dieci parole, ti invito a cercartela da solo
su google...
http://www.google.it/groups?as_q=lanciare%20attendere%20eseguibile&ie=UTF-8&
oe=UTF-8&as_ugroup=it.comp.lang.visual-basic&lr=&hl=it
(se il link risulta spezzato, ricomponilo, fà almeno questo)
--
Salutoni
Sergio

 (se il link risulta spezzato, ricomponilo, fà almeno questo)
Va bene che di VB so poco, ma sottovalutarmi così :-) :-(


 sia sempre attiva. In caso non sia attiva la deve lanciare.
Vedi se questo puo' aiutarti:
Sub RunExternal (programma As String, style As Integer)
    ' Lancia una applicazione esterna e ne attende la conclusione.
    Dim ext_h As Long
    ext_h = Shell(programma, style)
    Do While GetModuleUsage(ext_h) > 0
        DoEvents
    Loop
End Sub
-- 
Ciao!
   -DocDoc-
--- Per scrivermi: 
do...@despammed.com
Sei anche tu stanco dei messaggi spam? Usa Terminator, il programma
anti-spam italiano FREEWARE! 
http://www.sertel.net/terminator/

     Do While GetModuleUsage(ext_h) > 0
ehm... mi pareva non funzionasse troppo bene sui sistemi win32...
--
Salutoni
Sergio

>     Do While GetModuleUsage(ext_h) > 0
               ^^^^^^^^^^^^^^
Era la soluzione più pulita che ho visto, non fosse che questo non so cosa
sia :-) 
Grazie comunque


 sia :-)
Ehm, avete ragione, scusatemi, quella e' un'API vecchia, che non esiste
(purtroppo) piu', l'avevo presa da un mio vecchio codice non badando al
fatto che fosse per VB4 16 bit...
Ora bisogna fare tutto quel bordello di dichiarazioni, costanti e tipi che
ti hanno indicato (e che ho letto solo poco fa)...:-(


 Va bene che di VB so poco, ma sottovalutarmi così :-) :-(
Chiamata della minchiola una sega!
A pensarlo fai in un lampo!
D'altronde anche la cura per il cancro si pensa in un lampo "Riparare o
ammazzare le cellule cattive" !
E' l'implementazione che è difficile!!!
D'altronde un SO non è altro che una "melassa" di programmi che girano in
concorrenza!
E quindi stoppare una serie di programmi per aspettarne un altro è tutto
fuorchè una cosa banale!
...tanto per la cronaca eh!
senza polemica!
Ciao!

 ti hanno indicato (e che ho letto solo poco fa)...:-(
Esiste anche una versione un po' piu' semplice:
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
Declare Function CloseHandle Lib "kernel32" ( _
 ByVal hObject As Long) As Long
Const STILL_ACTIVE As Long = &H103
Const PROCESS_QUERY_INFORMATION As Long = &H400
Public Function IsProcessRunning(ByVal ShellID As Double) As Boolean
    Dim hProc As Long, iRet As Long
    hProc = OpenProcess(PROCESS_QUERY_INFORMATION, False, ShellID)
    If hProc <> 0 Then GetExitCodeProcess hProc, iRet
    IsProcessRunning = CBool(iRet = STILL_ACTIVE)
    CloseHandle hProc
End Function
Funzione da chiamare con qualcosa del genere:
Private Sub cmdStart_Click()
    Dim ID As Double
    ID = Shell("c:\windows\notepad.exe", vbNormalFocus)
    Me.Enabled = False
    Me.Caption = "Processo in corso, attendere..."
    Do While IsProcessRunning(ID)
        DoEvents
        Sleep 300
    Loop
    Me.Enabled = True
    Me.Caption = "Processo terminato"
End Sub
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 senza polemica!
Effettivamente, non l'avevo pensata da questo punto di vista =:-|


 Ciao!
Stai tranquillo, senza polemica.
Mario