Newsgroup: it.comp.lang.visual-basic
Titolo: Come capire che un programma lanciato via shell ha terminato......

Sapete dirmi quale api posso usare per capire se un programma lanciato con
l'instruzione shell abbia terminato?
mi spiego meglio:
1) lancio un exe via shell
2) vorrei ciclare finchè il programma ha terminato o altrimenti avere
notifica
sto parlando in ambiente nt ...........
ho visto esempi in cui si parlava di getmoduleusage in kernel, c'è un
analogo in win32???
se avete info ......
ciao e grazie

 wrote in message
7k63b1$59i$1...@serv1.iunet.it...


se avete info ......
Prova a incollare questo in un file di testo e poi rinominalo come Form1.frm:
=== Inizio Form ====
VERSION 5.00
Begin VB.Form Form1
   BorderStyle     =   1  'Fixed Single
   Caption         =   "Shell sincrona"
   ClientHeight    =   1245
   ClientLeft      =   45
   ClientTop       =   330
   ClientWidth     =   4680
   LinkTopic       =   "Form1"
   MaxButton       =   0   'False
   ScaleHeight     =   1245
   ScaleWidth      =   4680
   StartUpPosition =   2  'CenterScreen
   Begin VB.TextBox txtShell
      Height          =   285
      Left            =   105
      TabIndex        =   2
      Text            =   "c:\windows\calc.exe"
      Top             =   420
      Width           =   3375
   End
   Begin VB.CommandButton cmdShell
      Caption         =   "Avvia"
      Height          =   330
      Left            =   3570
      TabIndex        =   0
      Top             =   420
      Width           =   1065
   End
   Begin VB.Label lblShell
      AutoSize        =   -1  'True
      BackStyle       =   0  'Transparent
      Caption         =   "Programma da avviare"
      Height          =   195
      Left            =   105
      TabIndex        =   3
      Top             =   210
      Width           =   1590
   End
   Begin VB.Label lblMsg
      BorderStyle     =   1  'Fixed Single
      Height          =   285
      Left            =   0
      TabIndex        =   1
      Top             =   945
      Width           =   4635
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Private Declare Function OpenProcess Lib "kernel32" ( _
 ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
 ByVal dwProcessID As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" ( _
 ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" ( _
 ByVal hObject As Long) As Long
Const STILL_ACTIVE As Long = &H103
Const PROCESS_QUERY_INFORMATION As Long = &H400
Private ShellHandle As Variant
Public Function IsProcessRunning(ByVal TaskID As Variant) As Boolean
'Ritorna True se un processo figlio avviato con Shell e' ancora in esecuzioine
'False se invece e' terminato. Il parametro è l'handle restituito dalla
'funzione Shell
Dim hProc As Long, iRet As Long
'Recuperiamo l'handle di processo
hProc = OpenProcess(PROCESS_QUERY_INFORMATION, False, TaskID)
'Controlliamo lo stato del processo
If hProc <> 0 Then GetExitCodeProcess hProc, iRet
IsProcessRunning = CBool(iRet = STILL_ACTIVE)
CloseHandle hProc
End Function
Private Sub cmdShell_Click()
ShellHandle = Shell(txtShell, vbNormalFocus)
Me.Enabled = False
Do While IsProcessRunning(ShellHandle)
    lblMsg = "processo in corso, attendere..."
    DoEvents
Loop
Me.Enabled = True
lblMsg = "processo terminato."
End Sub
=== Fine Form ====
Ciao
--
Luca Dormio
l...@sig-la.com
ldo...@tin.it