C/Visual C - Advanced: Eliminar Procesos por Nombre...

 
Vista:

Advanced: Eliminar Procesos por Nombre...

Publicado por Magic (2 intervenciones) el 26/08/2001 03:24:40
Quisiera saber que funcion es la que me da el handle de un proceso del cual solo conozco el nombre. Digamos por ejemplo que quisiera eliminar el proceso del SysTray o cualquier otro proceso que aparece en el Administrador de Tareas y que no tiene una ventana asociada.
El caso en concreto es un programa que estoy haciendo que lanza un ftp y para ello uso el ftp del Dos. Al ser una instruccion de MS-Dos se lanza una ventana windows de emulacion de MS-Dos la cual obligo a que no aparezca con un SW_HIDE, pero al terminar el proceso es imposible cerrar esta ventana o mejor dicho, si consigo cerrar la ventana con su handle pero queda un residuo de algun threat o algo que se llama WinOldApp o algo asi que no se como eliminar.

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Obtener el handle de un proceso por nombre

Publicado por Alejandro (913 intervenciones) el 11/10/2024 20:23:02
Magic, para obtener el handle de un proceso en Windows utilizando su nombre, puedes usar la API de Windows. A continuación, te muestro cómo hacerlo, así como cómo terminar un proceso específico.

1. Incluir las bibliotecas necesarias



Asegúrate de incluir las siguientes bibliotecas en tu código:

1
2
3
#include <windows.h>
#include <tlhelp32.h>
#include <iostream>

2. Función para obtener el handle del proceso



Puedes usar la siguiente función para obtener el handle de un proceso dado su nombre:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
HANDLE GetProcessHandleByName(const char* processName) {
    HANDLE hProcessSnap;
    PROCESSENTRY32 pe32;
 
    // Tomar un "snapshot" de los procesos en ejecución
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_PROCESS, 0);
    if (hProcessSnap == INVALID_HANDLE_VALUE) {
        return NULL;
    }
 
    pe32.dwSize = sizeof(PROCESSENTRY32);
 
    // Obtener información del primer proceso
    if (!Process32First(hProcessSnap, &pe32)) {
        CloseHandle(hProcessSnap);
        return NULL;
    }
 
    // Iterar a través de los procesos
    do {
        if (strcmp(pe32.szExeFile, processName) == 0) {
            // Abrir el proceso y devolver el handle
            HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pe32.th32ProcessID);
            CloseHandle(hProcessSnap);
            return hProcess;
        }
    } while (Process32Next(hProcessSnap, &pe32));
 
    CloseHandle(hProcessSnap);
    return NULL; // No se encontró el proceso
}

3. Función para terminar el proceso



Una vez que tengas el handle del proceso, puedes usarlo para terminar el proceso:

1
2
3
4
5
6
7
8
9
10
11
void TerminateProcessByName(const char* processName) {
    HANDLE hProcess = GetProcessHandleByName(processName);
    if (hProcess != NULL) {
        // Terminar el proceso
        TerminateProcess(hProcess, 0);
        CloseHandle(hProcess);
        std::cout << "Proceso terminado: " << processName << std::endl;
    } else {
        std::cout << "No se encontró el proceso: " << processName << std::endl;
    }
}

4. Uso de las funciones



Puedes llamar a `TerminateProcessByName` pasando el nombre del proceso que deseas terminar:

1
2
3
4
5
int main() {
    const char* processName = "ftp.exe"; // Cambia esto al nombre del proceso que deseas terminar
    TerminateProcessByName(processName);
    return 0;
}

Consideraciones:



- Permisos: Asegúrate de que tu aplicación tenga los permisos necesarios para terminar otros procesos. Si no tienes los permisos adecuados, `OpenProcess` puede fallar.
- Cierre de procesos: Terminar un proceso de manera abrupta puede causar pérdida de datos o corrupción. Asegúrate de que es seguro hacerlo.
- WinOldApp: Si estás lidiando con un proceso de consola que no se cierra correctamente, asegúrate de que todos los hilos y recursos asociados se liberen adecuadamente. A veces, el uso de `SW_HIDE` puede causar que la ventana de consola no se cierre correctamente. Considera usar `CreateProcess` con la opción `CREATE_NO_WINDOW` para evitar que aparezca la ventana de consola en primer lugar.

Con este enfoque, deberías poder obtener el handle de un proceso por su nombre y terminarlo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar