MKB-551101
Para poder cerrar un proceso hay que seguir los siguientes pasos:
1. Obtener el identificador del proceso.
2. Abrir el proceso a partir de su identificador. Para ello, hay que utilizar la función OpenProcess:
Private Declare Function OpenProcess Lib "kernel32" (ByVal _
dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal _
dwProcessId As Long) As Long
3. Comprobar el estado del proceso con la función GetExitCodeProcess para comprobar que está activo:
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal _
hProcess As Long, lpExitCode As Long) As Long
4. Si el proceso está activo hay que cerrarlo con la función TerminateProcess:
Private Declare Function TerminateProcess Lib "kernel32" (ByVal _
hProcess As Long, ByVal uExitCode As Long) As Long
5. Por último, si el proceso se cerró correctamente hay que liberar su manejador asociado con CloseHandle:
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject _
As Long) As Long
A continuación, se muestra un ejemplo en Visual Basic que implementa el kill -9. Siga los siguientes pasos para probar el código:
1. Cree un nuevo proyecto con un formulario.
2. Añada un botón y una caja de texto con las siguientes propiedades:
Command1
Name: btnCerrar
Caption: &Matar Proceso
Text1
Name: txtIdProceso
Text: ""
3. Copie o pegue el siguiente código en el formulario:
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 TerminateProcess Lib "kernel32" _
(ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject _
As Long) As Long
Const PROCESS_TERMINATE = &H1
Const PROCESS_QUERY_INFORMATION = &H400
Const STILL_ACTIVE = &H103
Private Sub btnCerrar_Click()
Dim hProceso As Long
Dim lEstado As Long
' Obtenemos el handle al proceso
hProceso = OpenProcess(PROCESS_TERMINATE Or _
PROCESS_QUERY_INFORMATION, 0, CLng(txtIdProceso))
If hProceso <> 0 Then
' Comprobamos estado del proceso
GetExitCodeProcess hProceso, lEstado
If lEstado = STILL_ACTIVE Then
' Cerramos el proceso
If TerminateProcess(hProceso, 9) <> 0 Then
MsgBox "Proceso cerrado"
Else
MsgBox "No se pudo matar el proceso"
End If
End If
' Cerramos el handle asociado al proceso
CloseHandle hProceso
Else
MsgBox "No se pudo tener acceso al proceso"
End If
End Sub