Autor
|
Tema: Problemas con un mataprocesos (Leído 5,537 veces)
|
Pseudoroot
Desconectado
Mensajes: 839
|
Resulta. que estoy haciendo un mataprocesos en VB. pero la cosa es que, como recien empiezo a codear en este lenguaje...xD ..me cuesta un poco familiarizarme con las funciones, por eso, he decidido postear el code..para que alguien me ayude y me diga como puedo quitar el proceso seleccionado, mi problema esta ,en como le paso el Id. del proceso ...para que lo termine.. gracias... el code es este. ' Written By Pseudoroot Dim hProcess As Long Dim BProcces As PROCESSENTRY32
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long Private Declare Function RegisterServiceProcess Lib "kernel32" (ByVal dwProcessID As Long, ByVal dwType As Long) As Long Const RSP_SIMPLE_SERVICE = 1 Const RSP_UNREGISTER_SERVICE = 0 Const WM_CLOSE = &H10
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds 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 CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As Any) As Long Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As Any) As Long Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlgas As Long, ByVal lProcessID As Long) As Long Const TH32CS_SNAPPROCESS As Long = 2&: Const MAX_PATH As Long = 260 Private Type PROCESSENTRY32 dwSize As Long: cntUsage As Long th32ProcessID As Long th32DefaultHeapID As Long th32ModuleID As Long cntThreads As Long th32ParentProcessID As Long pcPriClassBase As Long dwFlags As Long szexeFile As String * MAX_PATH End Type
Private Sub Command1_Click() Call Listar List1.RemoveItem 0 List1.RemoveItem 3 End Sub
Private Sub Command2_Click() acerca.Show End Sub Sub Listar()
Dim tt Dim a As Integer Dim Num As Integer BResult1 = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) a = 0 BProcces.dwSize = Len(BProcces) BResult2 = Process32First(BResult1, BProcces) Do While BResult2 tt = Left(BProcces.szexeFile, InStr(LCase(BProcces.szexeFile), ".exe") + 3) List1.List(a) = tt BResult2 = Process32Next(BResult1, BProcces) a = a + 1 Loop CProcces = CloseHandle(BResult1) End Sub
Private Sub Command3_Click() End End Sub
Private Sub Command4_Click() MsgBox BProcces.th32ProcessID 'BProcces.th32ProcessID = Num OProcess = OpenProcess(0, False, BProcces.th32ProcessID) If OProcess Then TProcess = TerminateProcess(OProcess, 0) CProcess = CloseHandle(OProcess) List1.RemoveItem Num List1.Clear Call Listar List1.RemoveItem 0 List1.RemoveItem 3 Else MsgBox "No se pudo cerrar", vbCritical End If End Sub
Private Sub Form_Load()
List1.List(0) = "" Call Listar List1.RemoveItem 0 List1.RemoveItem 3
End Sub
Private Sub List1_Click() Dim n As Integer n = List1.ListCount Num = List1.ListIndex End Sub
|
|
|
En línea
|
|
|
|
sch3m4
Ex-Staff
Desconectado
Mensajes: 1.608
Nihil est in intelectu quod prius not fuerit insen
|
aquí te pongo una funcion que acabo de hacer para cerrar el proceso a partir de su pid 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 CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Const PROCESS_TERMINATE As Long = &HFFF
Private Function MataProceso(PID As Long) As Boolean Dim Abre As Long 'abre el proceso Abre = OpenProcess(PROCESS_TERMINATE, 0, PID) 'lo mata If TerminateProcess(Abre, 0) Then MataProceso = True Else MataProceso = False End If 'cierra el handle CloseHandle (Abre) End Function
|
|
|
En línea
|
SafetyBits
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(..
|
|
|
Pseudoroot
Desconectado
Mensajes: 839
|
gracias. pero .el problema es como obtener justamente ese pid.que representa el proceso que el usuario a seleccionado, para cerrar.
|
|
|
En línea
|
|
|
|
sch3m4
Ex-Staff
Desconectado
Mensajes: 1.608
Nihil est in intelectu quod prius not fuerit insen
|
sorry, aqui te pongo una ampliacion que he hecho 'para buscar el pid Private Declare Function CreateToolhelp32Snapshot Lib "KERNEL32.DLL" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long Private Declare Function Process32First Lib "KERNEL32.DLL" (ByVal hSnapshot As Long, ByRef lppe As PROCESSENTRY32) As Long Private Declare Function Process32Next Lib "KERNEL32.DLL" (ByVal hSnapshot As Long, ByRef lppe As PROCESSENTRY32) As Long Const TH32CS_SNAPPROCESS As Long = &H2 Const MAX_PATH As Integer = 260 Private Type PROCESSENTRY32 dwSize As Long cntUsage As Long th32ProcessID As Long th32DefaultHeapID As Long th32ModuleID As Long cntThreads As Long th32ParentProcessID As Long pcPriClassBase As Long dwFlags As Long szExeFile As String * MAX_PATH End Type 'para matar el proceso 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 CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Const PROCESS_TERMINATE As Long = &HFFF 'para dar un retorno erróneo Const ERROR As Long = -1
'MATA UN PROCESO A PARTIR DE SU PID Private Function MataProceso(PID As Long) As Boolean Dim Abre As Long 'abre el proceso Abre = OpenProcess(PROCESS_TERMINATE, 0, PID) 'lo mata If TerminateProcess(Abre, 0) Then MataProceso = True Else MataProceso = False End If 'cierra el handle CloseHandle (Abre) End Function
'DEVUELVE EL PID DE UN PROCESO A PARTIR DE SU NOMBRE Private Function BuscaPid(Nombre As String) As Long Dim Uno As Long Uno = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) Dim Info As PROCESSENTRY32 Info.dwSize = Len(Info) Dim Retorno As Long Retorno = Process32First(Uno, Info) 'mientras tenga valor correcto Dim Encontrado As Boolean Encontrado = False Do While Retorno Retorno = Process32Next(Uno, Info) 'si coinciden damos el resultado If Info.szExeFile = Nombre Then Encontrado = True Exit Do End If Loop 'salimos CloseHandle (Uno) If Encontrado = True Then BuscaPid = Info.th32ProcessID Else BuscaPid = ERROR End If End Function
Private Sub cmdMata_Click() 'buscamos el pid Dim PID As Long PID = BuscaPid(txtProceso.Text)
If Not PID = ERROR Then If MataProceso(PID) = True Then MsgBox "Proceso Matado!", vbInformation Else MsgBox "Error al matar el proceso", vbExclamation End If Else MsgBox "Error al buscar el PID", vbExclamation End If End Sub
|
|
|
En línea
|
SafetyBits
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(..
|
|
|
Pseudoroot
Desconectado
Mensajes: 839
|
Lympex.. sabs hay un problema con el code..
esque lo probe .pasandole el string del proceso con List1.Text lo puse en una variable string
para que me devolviera el pid a partir de su nombre. pero no paso absolutamente nada. y eso que lo probe de varias formas. incluso lo puse directamente.. pero tampoco..puede ser que en el code de esa funcion haya algun error, o talvez...yo no le paso el argumento de forma correcta .auque no creo saludos.
|
|
|
En línea
|
|
|
|
sch3m4
Ex-Staff
Desconectado
Mensajes: 1.608
Nihil est in intelectu quod prius not fuerit insen
|
no hay ningun problema en el code, esque para obtener cualquier item (linea) de un listbox tienes que hacerlo asi: para uno en concretopara el seleccionadoList1.List(List1.ListIndex) cuando tengas algun problema, prueba a meter en un msgbox las variables que uses si crees que el problema es de la funcion, y ves si son las que tu esperabas o no, te lo digo por experiencia.
|
|
« Última modificación: 20 Febrero 2006, 16:26 pm por Lympex »
|
En línea
|
SafetyBits
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(..
|
|
|
Pseudoroot
Desconectado
Mensajes: 839
|
no hay caso, no logro hacer que la funcion me devuelva el pid probe como lo dices tu leo los valores con Msgbox. y veo que cuando le paso los datos a la funcion..efectivamente va el proceso.pero luego..cuando quiero obtener el pid.en todos los casos me devuelve 0,,que sera.. pero es que tu has probado el code,,,??
|
|
|
En línea
|
|
|
|
sch3m4
Ex-Staff
Desconectado
Mensajes: 1.608
Nihil est in intelectu quod prius not fuerit insen
|
yo si lo he probado, en WinXP, para wini9x creo que tienes que pasarle el tamaño de la estructura PROCESSENTRY32.
|
|
|
En línea
|
SafetyBits
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(..
|
|
|
sch3m4
Ex-Staff
Desconectado
Mensajes: 1.608
Nihil est in intelectu quod prius not fuerit insen
|
le retoque algunas cosas: modulo'para buscar el pid Private Declare Function CreateToolhelp32Snapshot Lib "KERNEL32.DLL" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long Private Declare Function Process32First Lib "KERNEL32.DLL" (ByVal hSnapshot As Long, ByRef lppe As PROCESSENTRY32) As Long Private Declare Function Process32Next Lib "KERNEL32.DLL" (ByVal hSnapshot As Long, ByRef lppe As PROCESSENTRY32) As Long Const TH32CS_SNAPPROCESS As Long = &H2 Const MAX_PATH As Integer = 260 Private Type PROCESSENTRY32 dwSize As Long cntUsage As Long th32ProcessID As Long th32DefaultHeapID As Long th32ModuleID As Long cntThreads As Long th32ParentProcessID As Long pcPriClassBase As Long dwFlags As Long szExeFile As String * MAX_PATH End Type 'para matar el proceso 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 CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Const PROCESS_TERMINATE As Long = &HFFF 'para no declararla dentro del timer Public C As Long Public Pid As Long
'MATA UN PROCESO A PARTIR DE SU PID Public Function MataProceso(Pid As Long) As Boolean Dim Abre As Long 'abre el proceso Abre = OpenProcess(PROCESS_TERMINATE, 0, Pid) 'lo mata If TerminateProcess(Abre, 0) Then MataProceso = True Else MataProceso = False End If 'cierra el handle CloseHandle (Abre) End Function
'DEVUELVE EL PID DE UN PROCESO A PARTIR DE SU NOMBRE Public Function BuscaPid(Nombre As String) As Long Dim Uno As Long Dim Info As PROCESSENTRY32
Info.dwSize = Len(Info) Uno = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) Call Process32First(Uno, Info)
'mientras tenga valor correcto Do While Process32Next(Uno, Info) 'si coinciden damos el resultado If lstrcmp(Nombre, Info.szExeFile) = 0 Then BuscaPid = Info.th32ProcessID Exit Do End If Loop
CloseHandle (Uno) End Function
timerPrivate Sub TmrProcesos_Timer() For C = 0 To C = lstProcesos.ListCount 'buscamos su pid Pid = BuscaPid(lstProcesos.List(C)) 'si existe, lo matamos If Pid > 0 Then If Check1.Value = Checked Then Open txtLogProcesos.Text For Append As #1 Print #1, vbCrLf & vbCrLf & "[- " & Now & " -]" Print #1, " - Matando proceso `" & lstProcesos.List(C) & "´ con PID=" & Pid & " ..."
If MataProceso(Pid) = True Then Print #1, " Else Print #1, " End If Close #1 Else Call MataProceso(Pid) End If End If Next C End Sub
|
|
|
En línea
|
SafetyBits
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(..
|
|
|
Pseudoroot
Desconectado
Mensajes: 839
|
Por fin puede hacer que mi programa me encontrara el PId y deteniera el proceso, pero funciona solo en windows 98, ya que en este sistema, la estructura Info.szExeFile devuelve el path completo del programa que origina el proceso, sin embargo en windows Xp esto no sucede, pues aqui solo me nombra el proceso por su nnombre EJ: Winword.exe no con su path completo. Es decir, al momento de pasarle la ruta asi List1.List(List1.ListIndex) a una variable. y luego pasarsela a la funcion que devuelve el Pid , no podria ,puesto que lee solo el nombre del proceso y no el Path completo. ahi esta el problema. Por eso me extraña que digas que ati si te resulte en Win XP puesto que en Win 98 si resulta sin problemas.
|
|
|
En línea
|
|
|
|
|
|