• Domingo 22 de Diciembre de 2024, 03:17

Autor Tema:  Eliminar Procesos  (Leído 878 veces)

elburrow

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Eliminar Procesos
« en: Viernes 23 de Abril de 2004, 16:35 »
0
Buenas

Mi pregunta es ¿se puede eliminar un proceso de memoria sin tener que correr antes esa aplicacion para poder eliminarla?  

De antemano gracias.

Este es el codigo: (un formulario, tres botones, una caja de texto y un modulo)

Option Explicit
Private Sub cmdStart_Click()
Dim sTemp As String

sTemp = Trim$(txtProcess)
If sTemp = "" Then Exit Sub

glPid = Shell(sTemp, vbNormalFocus)
If glPid = 0 Then
    MsgBox "Could not start process", vbExclamation, "Error"
End If
End Sub
Private Sub cmdKill_Click()
Dim i As Long

Call fEnumWindows

For i = 1 To colHandle.Count
    glHandle = colHandle.Item(i)
    Call SendMessage(glHandle, WM_CLOSE, 0&, 0&)
Next
End Sub
Private Sub cmdQuit_Click()
Unload Me
End Sub


y el modulo

Option Explicit
Public glPid     As Long
Public glHandle  As Long
Public colHandle As New Collection

Public Const WM_CLOSE = &H10
Public Const WM_DESTROY = &H2

Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

Public Function fEnumWindowsCallBack(ByVal hwnd As Long, ByVal lpData As Long) As Long
Dim lParent    As Long
Dim lThreadId  As Long
Dim lProcessId As Long

fEnumWindowsCallBack = 1
lThreadId = GetWindowThreadProcessId(hwnd, lProcessId)

If glPid = lProcessId Then
    lParent = GetParent(hwnd)
    If lParent = 0 Then
        colHandle.Add hwnd
    End If
End If
End Function

Public Function fEnumWindows() As Boolean
Dim hwnd As Long
Call EnumWindows(AddressOf fEnumWindowsCallBack, hwnd)
End Function

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Eliminar Procesos
« Respuesta #1 en: Martes 27 de Abril de 2004, 09:56 »
0
Hola elburrow.

No sé si te he comprendido muy bien... Hablas de terminar un proceso sin tener que lanzarlo, pero luego en el código que adjuntas, el proceso es lanzado mediante shell.

Fíjate a ver si algo de esto a ver si te sirve. El código ejecuta un proceso y después de 1 minuto, si no ha finalido se fuerza la finalización:
Código: Text
  1.  
  2. Private Const STILL_ACTIVE = &H103
  3. Private Const PROCESS_QUERY_INFORMATION = &H400
  4. Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessID As Long) As Long
  5. Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
  6. Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
  7. Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
  8.  
  9. Private sub Prueba
  10.     Dim lng1 As Long, lngRc As Long
  11.     lng1 = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell("C:\Ruta\Ejecutable.exe", vbNormalFocus))
  12.     Sleep 60000
  13.     GetExitCodeProcess lng1, lngRc
  14.     If lngRc = STILL_ACTIVE Then TerminateProcess lng1, lngRc
  15. End Sub
  16.  
  17.  

Suerte.

elburrow

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Eliminar Procesos
« Respuesta #2 en: Miércoles 28 de Abril de 2004, 00:04 »
0
Gracias por tu respuesta Brroz

Mi pregunta estuvo mal hecha, el codigo que anexe hace lo que dice mi pregunta, pone a correr un proceso X para despues eliminarlo, lo que quise decir era que si el proceso ya estaba corriendo, ¿como quitarlo de memoria? ya sea mediante su PID o su nombre, pero ya tengo el codigo para hacerlo de esta manera.

Saludos.