Newsgroup: it.comp.lang.visual-basic
Titolo: Task List in VB4

	Avrei bisogno di ottenere in VB4 32 bit una lista dei task attivi
in un dato momento, piu' o meno come fa il comando PS di derivazione Unix.
Non sono riuscito a trovare un sorgente decente di questo comando e
quindi non ho idee di come si potrebbe implementare con le API di Windows,
al momento mi limito a estrarre l'output del comando PS salvato in un
file, ma chiaramente non si tratta di una soluzione elegante.
	Se qualcuno ha idee...
	Grazie e alle prossime.
          /////
B/B/B/B ///     Guido Zualdi - Responsabile tecnico
/y/y/y ///          Netanday Lignano Sabbiadoro
e/e/e ///  ///            (Udine) Italy
      //////uido       

Se volete avere sotto controllo tutti i vari processi attivi in un
determinato momento dalla vostra applicazione VB dovete fare uso della
libreria ToolHelp32.dll.
Questa dll vi permette di analizzare a basso livello tutti quello che sta
girando (DLL,EXE...) assieme alla vostra applicazione offrendovi una serie
di informazioni (nella struttura ProcessEntry 32) che potete poi utilizzare
in seguito grazie all'aiuto di altre API.
In questo esempio descriveró come creare una applicazione tipo WPS (presente
sul cd di VB4.0),che visualizza tutti i processi attivi e vi permette di
terminarne alcuni.
'// Dichiarazioni necessarie (consiglio di metterle in un file BAS)
Public Const TH32CS_SNAPPROCESS As Long = 2
Public Const PROCESS_TERMINATE As Long = 1
Type PROCESSENTRY32
    dwSize As Long   '// Identifica la lunghezza in byte della struttura
(classico nelle API)
    cntUsage As Long   '//  Indica quanti processi riferiscono a tale
processo (tipo DLL)
    th32ProcessID As Long   '//  ID del processo
    th32DefaultHeapID As Long  '//   Heap default del processo
    th32ModuleID As Long   '//  Uso interno da Toolhelp32
    cntThreads As Long   '//  Numero dei thread lanciati dal processo
    th32ParentProcessID  As Long  '//  Process ID del processo che ha
lanciato questo processo
    pcPriClassBase As Long  '//  Prioritá base dei thread creati da questo
processo
    dwFlags As Long   '//   Riservato
    szExeFile As String * 259  '//   Nome del file,completo di path, del
processo.
End Type
Declare Function CreateToolhelp32Snapshot Lib "Kernel32" (ByVal dwFlags As
Long, ByVal dwth32processID As Long) As Long
Declare Function Process32First Lib "Kernel32" (ByVal hSnapShot As Long,
lppe As PROCESSENTRY32) As Long
Declare Function Process32Next Lib "Kernel32" (ByVal hSnapShot As Long, lppe
As PROCESSENTRY32) As Long
Declare Function TerminateProcess Lib "Kernel32" (ByVal hProcess As Long,
ByVal uExitCode As Long) As Long
Declare Function OpenProcess Lib "Kernel32" (ByVal dwDesiredAccess As Long,
ByVal bInheritHandle As Long, ByVal dwProcessID As Long) As Long
Declare Function CloseHandle Lib "Kernel32" (ByVal hSnapShot As Long) As
Long
Aprite un form,metteteci una listbox e due command button...
Nel codice di Command1 inserite il seguente codice :
Private Sub Command1_Click()
'//
***************************************************************************
'// Questa funzione elenca tutti i processi attivi e li elenca in una
listbox
'//  da notare che il ProcessID delle applicazioni viene memorizzato
'//  nell'itemdata della listbox
'//
***************************************************************************
Dim uPE As PROCESSENTRY32, hSh As Long, lRC As Long
'---------------------------------------------------------------------------
-------
List1.Clear
'// Legge l'attuale situazione (crea un immagine)
hSh = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
If hSh = -1 Then
    MsgBox "Errore Interno"
    Exit Sub
End If
'// Elenca tutti i processi attivi
uPE.dwSize = LenB(uPE)
lRC = Process32First(hSh, uPE)
Do While lRC = 1
With List1
   .AddItem uPE.szExeFile
                .ItemData(.NewIndex) = uPE.th32ProcessID
              End With
'// Passa al processo successivo
lRC = Process32Next(hSh, uPE)
Loop
'// Rilascia la memora occupata...
CloseHandle hSh
End Sub
In Command2 mettete questo codice :
Private Sub Command2_Click()
'// **************************************************
'// Termina il processo selezionato nella listbox
'// **************************************************
Dim hProcess As Long, lProcID As Long
'-----------------------------------------------------
lProcID = List1.ItemData(List1.ListIndex)
'// Richiede autorizzazione al sistema
hProcess = OpenProcess(PROCESS_TERMINATE, 1, lProcID)
'// Termina il processo selezionato
TerminateProcess hProcess, 0
End Sub
Il codice è molto scarno e privo di controlli relativi ad eventuali errori
ritornati dalle API,questo lo lascio fare a voi.
ATTENZIONE !: Toolhelp32 non è presente in Windows NT.
Ciao
Corrado
Guido Zualdi ha scritto nel messaggio ...