Newsgroup: it.comp.lang.visual-basic
Titolo: Come killare un processo ???

Ciao a tutti,
mi piacerebbe molto sapere come cavolo si fa a killare una qualunque
applicazione windows attiva.
Ho già letto la news del 12/11/2001... ma non mi ha dato l'informazione che
volevo, nel senso che non ho capito che parametri si passano a questa
funzione TerminateProcess()  ??
A me l'applicazione VB dice che non la riconosce....  (premetto che sto
usando VB solo da 2 giorni,... :-) )
Grazie
ciao

 usando VB solo da 2 giorni,... :-) )
Perche' non e' una funzione di VB... ma un'API.
Quindi la devi dichiarare... metti in un modulo standard:
Public Declare Function TerminateProcess Lib "kernel32" Alias
"TerminateProcess" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Per l'uso ti rimando all'help... visto che non l'ho mai usata.
Ciao.

 ha scritto nel messaggio
news:SN1N7.24829$4M2.6...@news2.tin.it...


> usando VB solo da 2 giorni,... :-) )
S> Public Declare Function TerminateProcess Lib "kernel32" Alias
S> "TerminateProcess" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
S> Per l'uso ti rimando all'help... visto che non l'ho mai usata.
Ed e` meglio  non usarla. Infatti quando si  invoca quella funzione il
sistema NON richiama  la DllMain() delle varie dll  usate dal processo
(aka non notifica) col risultato che  per lo meno non scarichi piu` le
dll in  questione, e se va  male non viene  liberata memoria allocata,
oggetti  kernel ed  altro. Insomma,  ben progettato  Win32,  visto che
quando e` nato  era gia` noto da  decenni come fare in modo  che ad un
processo  fosse  comunicato di  terminare  immediatamente  ed in  modo
pulito l'esecuzione...
-- 
Gian  | main(){printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
Uberto|                        David Korn, 1987 ioccc best one liner 
Lauri |-------------------------------------------------------------------
(aka saint) >>Vedere X-Nospam nell'header - See X-Nospam field in Header<<

 ha scritto nel messaggio
news:usnazc...@mail.eng.it...


 sistema NON richiama  la DllMain() delle varie dll  usate dal processo
Lo so... purtroppo non conosco altri metodi...
:-(
Cmq non credo che il "Termina task" di WinNT
o il "Termina applicazione" di Win95/98/ME
facciano diversamente... e non a caso i risultati si vedono...
:-)
Ciao.

 ha scritto nel messaggio
news:fx3N7.25165$BA4.8...@news1.tin.it...


averlo, e in quale delle 2 posizioni dei parametri richiesti devo inserirlo?
Allora... pero' poi promettimi che studi ;-)
Il codice sotto la firma va copiato in un modulo .bas e per provarlo va lanciata
la TerminateApp.
Ho aggiunto un po' di commenti che illustrano anche dove reperire le informazioni
necessarie.
-- 
hth, hal
---------------------------- inizio codice -----------------
Option Explicit
'// costanti tratte da : HOWTO: Constants in OpenProcess API dsDesiredAccess Parameter
'// 
http://support.microsoft.com/support/kb/articles/q172/2/73.asp?FR=0
Private Const PROCESS_TERMINATE = &H1 'Enables using the process handle in the
            'TerminateProcess function to terminate the process.
Private Const SYNCHRONIZE = &H100000   'Enables using the process handle in any of the
            'wait functions to wait for the process to terminate.
'// costanti recuperate con Google
Private Const WAIT_OBJECT_0 = 0&
'// costante di comodo per mappatura con il codice c++
Private Const pNULL = 0&
'// dichiarazioni tratte dall' API viewer di vb
'      --- kernel32
Private Declare Function CloseHandle Lib "kernel32" ( _
                        ByVal hObject As Long _
                        ) As Long
Private Declare Function OpenProcess Lib "kernel32" ( _
                        ByVal dwDesiredAccess As Long, _
                        ByVal bInheritHandle As Long, _
                        ByVal dwProcessId As Long _
                        ) As Long
Private Declare Function TerminateProcess Lib "kernel32" ( _
                        ByVal hProcess As Long, _
                        ByVal uExitCode As Long _
                        ) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" ( _
                        ByVal hHandle As Long, _
                        ByVal dwMilliseconds As Long _
                        ) As Long
 
'       --- user32
Private Declare Function EnumWindows Lib "user32" ( _
                        ByVal lpEnumFunc As Long, _
                        ByVal lParam As Long _
                        ) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" ( _
                        ByVal hwnd As Long, _
                        ByRef lpdwProcessId As Long _
                        ) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" ( _
                        ByVal hwnd As Long, ByVal wMsg As Long, _
                        ByVal wParam As Long, ByVal lParam As Long _
                        ) As Long
Private Const WM_CLOSE = &H10
''''''''''''''''''''''''''''''''''''''''''''''''''''
'// codice liberamente portato dall' esempio in c++ su msdn:
'// HOWTO: Terminate an Application "Cleanly" in Win32
'// Q178893
'//
'// Per ottenere il PID del processo vedere l' articolo su msdn:
'// HOWTO: List Running Processes
'// Q187913
'//
Public Function TerminateApp(ByVal dwPID As Long, ByVal dwTimeout As Long) As Boolean
    Dim hProc As Long
 
    '// If we can't open the process with PROCESS_TERMINATE rights,
    '// then we give up immediately.
    hProc = OpenProcess(SYNCHRONIZE Or PROCESS_TERMINATE, 0&, dwPID)
    If (hProc = pNULL) Then Exit Function
    '// TerminateAppEnum() posts WM_CLOSE to all windows whose PID
    ' // matches your process's.
    EnumWindows AddressOf TerminateAppEnum, dwPID
 
    '// Wait on the handle. If it signals, great. If it times out,
    '// then you kill it.
    If (WaitForSingleObject(hProc, dwTimeout) <> WAIT_OBJECT_0) Then
         If (TerminateProcess(hProc, 0)) Then
            '// dirty termination
            TerminateApp = True
         End If
    Else
        '// clean termination :-)
         TerminateApp = True
    End If
 
    CloseHandle (hProc)
End Function    '// TerminateApp
Private Function TerminateAppEnum(ByVal hwnd As Long, ByVal lParam As Long) As Long
    Dim dwID As Long
    Call GetWindowThreadProcessId(hwnd, dwID)
    If (dwID = lParam) Then
        Call PostMessage(hwnd, WM_CLOSE, 0, 0)
    End If
    TerminateAppEnum = 1
End Function    '// TerminateAppEnum
---------------------------- fine codice --------------------------------

 applicazione windows attiva.
Potresti provare il mio ActiveX OpenClose: è gratuito e lo trovi nel sito
comune!