¿Cómo terminar proceso?
Buen dia a todos,
Tengo un problemita al terminar un proceso, siempre lo hacia con taskkill de la consola CMD, pero quiero terminarlo ahora desde c++, para no depender del CMD, encontre una función en builder para terminar procesos pero no me funciona, el código es: Código:
TerminateProcess(archivo, NULL); "archivo *32" , Será que como envió como parámetro el nombre a terminar, este no lo hace porque en el administrador de tareas figura con "*32"?, ya que estoy en un sistema de 64 bits. Saludos. |
La API TerminateProcess "Mata" un proceso determinado. El primer parámetro no es el nombre del archivo ejecutable sino el Handle del proceso en cuestión que previamente debes conseguir con OpenProcess.
Mira este ejemplo completamente funcional para conseguir matar un proceso conociendo el nombre de su ejecutable: Código:
// Termina los procesos conociendo el nombre del exe Saludos. |
Error en conversión
Hola escafandra,
probe tu código con la libreria: Cita:
el error que me muestra es el siguiente: Te agradeceria que me iluminaras en esta parte, como podría se convertiria a (const char*). Saludos. |
El código lo escribí para C++Builder 6, seguramente estás usando una versión superior que usa Unicode. Cambia stricmp por _wcsicmp que es su equivalente Unicode. Ciertamente debes incluir Tlhelp32.h
Saludos. |
Error en conversión
hola escafandra,
bueno, aún me sigue mostrando el casi mismo error: si encuentro la solucion por ahí para embarcadero xe c++, lo posteo. Saludos. |
Cambia tambien esto
Código:
bool TerminateProcess(char* FileName) Código:
bool TerminateProcessW(WCHAR* FileName) Te pongo la versión completa Unicode: Código:
#include <tlhelp32.h> Saludos. |
compilado sin efecto
Hola escafandra,
me compilo correctamente el código pero no me funciona, no elimina el proceso determinado, lo llamo de esta manera: Cita:
Saludos. |
Con ese código no puedes terminar con cualquier proceso sin más, Debes tener privilegios y permisos para abrir procesos de otros usuarios. Para ello puede ser necesario ejecutarlo como administrador y, además, tener privilegios "debug": SeDebugPrivilege. Por lo general, los administradores tienen privilegioSeDebugPrivilege pero puede estar anulado.
Otros procesos dererminados no pueden ser terminados ni por un administrador ya que son protegidos por el sistema desde el Kernel. Este es el caso de algunos "nombres sagrados" para windows o ciertos procesos SYSTEM o antivirus. Por último recuerda que ciertos procesos pueden estar protegidos por rootkits desde el kernel. Piensa que proceso quieres matar y cual es tu caso particular. Si te interesa, te muestro como elevar tus privilegios y asignarte privilegio debug u otro. Saludos. |
Caramba, repetí accidentalmente la publicación anterior... :o
Saludos. |
Procesos
Hola escafandra,
si me interesaria ver como asignar mas privilegios a mi debug, quizas se eso los procesos que quiero eliminar son solo procesos de ejecutables simples que se pueden programar en cualquier lenguaje, no son archivos del sistema o de programas instalados, sino que estoy haciendo una prueba ejecutando todos mis ".exe" que he programado y con un programa terminarlos uno por uno, encontre un código que hace exactamente lo que quiero pero funciona en consola nomás, funciona tanto para builder 6 y embarcadero, pero cuando lo llevo a formularios en embarcadero , es en donde me salen esos errores de "const char....", el código es este: Código:
#pragma hdrstop Saludos. |
El código debería funcionar independientemente de si se ejecuta en una consola o en GUI.
Esta es la forma de asignar privilegios al proceso actual: Código:
BOOL EnablePrivilege (PCSTR name, BOOL Enable = TRUE) El uso para matar procesos sería el siguiente: Código:
EnablePrivilege("SeDebugPrivilege", TRUE); // Nos asignamos privilegios debug Si ejecutas como administrador debería ser capaz de matar "casi" cualquier proceso. Saludos. |
Solucionado
Hola escafandra,
Gracias por el código de privilegios, tambien em funciono, como mencionaste, sobre " El código debería funcionar independientemente de si se ejecuta en una consola o en GUI", me parecio raro, así que decidí indagar por ahí, ya que a simple vista algo estaba mal, y no encontraba la solución a "porque funciona en consola y no en GUI", así que compare ambos proyectos, tanto el de consola como el de GUI, buscando opciones , librerias, etc. y encontre una pequeña diferencia pero obvia quizas para algunos, novedosa para mi como principiante. Cuando creas un proyecto en consola (embarcadero XE) por defecto te se crea con "char" en Project->Options-> _TCHAR maps to = "char". pero cuando creas un proyecto en GUI, por defecto se crea así: Project->Options-> _TCHAR maps to = "wchar_t". solo cambie el "wchar_t" por "char" y listo todos los códigos que mencionaste anteriormente funcionan sin problemas, sin necesidad de cambiarlos como en el UNICODE, te corre normal, ahora buscando un poco mas sobre eso, encontre sobre los standares del C++, siendo el último el C++11, donde cambia por el standard anterior por el nuevo (hasta donde entendí , quizas me equivoque), y el cual es el que trabaja por defecto el embarcadero XE, bueno les dejo el link para que indague mas el que desee: no se me permiten link pero esta en wikipedia, solo pongan C++11. Gracias por los códigos escafandra, si funcionaban, sino que el error era mío, ahora si recien podre cerrar los ojos, :o. Saludos. |
No deberías cambiar la opción por defecto de usar wchar_t (WCHAR) en GUI pues es la tendencia de todos los compiladores y del mismo Windows. Lo correcto es saber cuando usas UNICODE (WCHAR) y cuando no y controlar ese aspecto para no tener más dolores de cabeza con este tema.
Revisa esto para comprender las formas de conversión y recuerda asignar a un String de esta forma: Código:
String Texto = TEXT("mi texto"); Saludos. |
Procesos
Hola escafandra,
Ok, lo tendre en cuenta, si ahora que lo mencionas, es la tendencia, y es mejor saber cuando utilizar las conversiones, ya que por lo que veo, actualmente la tendencia es a "wchar_t". Saludos. |
La franja horaria es GMT +2. Ahora son las 00:19:12. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi