Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-12-2013
darkmir darkmir is offline
Miembro
NULL
 
Registrado: abr 2013
Posts: 28
Poder: 0
darkmir Va por buen camino
¿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);
Pero no puedo eliminarlo tras ejecutarlo, "archivo", recibe el nombre del archivo del proceso que quiero terminar, será que algo estoy haciendo mal?, o quizás sea que envió mal el parámetro, porque cuando veo en el administrador de tarea, veo a mi archivo así:

"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.
Responder Con Cita
  #2  
Antiguo 14-12-2013
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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
bool TerminateProcess(char* FileName)
{
   DWORD  Result  = 0;
   HANDLE Process = 0;
   PROCESSENTRY32 proc = { sizeof(proc) };
   HANDLE hSysSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
   if(hSysSnapshot != INVALID_HANDLE_VALUE && Process32First(hSysSnapshot, &proc)){
     do{
        if(!stricmp(proc.szExeFile, FileName)){
           Result = proc.th32ProcessID;
           if(Result)
              Process = OpenProcess(PROCESS_ALL_ACCESS, false, Result);
              if(Process){
                 Result = TerminateProcess(Process, 0);
                 CloseHandle(Process);
              }   
        }
     }while(Process32Next(hSysSnapshot, &proc));
   }
   CloseHandle(hSysSnapshot);
   return (bool)Result;
}

Saludos.
Responder Con Cita
  #3  
Antiguo 14-12-2013
darkmir darkmir is offline
Miembro
NULL
 
Registrado: abr 2013
Posts: 28
Poder: 0
darkmir Va por buen camino
Error en conversión

Hola escafandra,

probe tu código con la libreria:
Cita:
#include <Tlhelp32.h>
con el cual reconoce toda la estructura, pero me sale un error al momento de compilar:



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.
Responder Con Cita
  #4  
Antiguo 14-12-2013
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita
  #5  
Antiguo 14-12-2013
darkmir darkmir is offline
Miembro
NULL
 
Registrado: abr 2013
Posts: 28
Poder: 0
darkmir Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 14-12-2013
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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>

// Termina los procesos conociendo el nombre del exe
bool TerminateProcessW(WCHAR* FileName)
{
   DWORD  Result  = 0;
   HANDLE Process = 0;
   PROCESSENTRY32W proc = { sizeof(proc) };
   HANDLE hSysSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
   if(hSysSnapshot != INVALID_HANDLE_VALUE && Process32FirstW(hSysSnapshot, &proc)){
     do{
        if(!_wcsicmp(proc.szExeFile, FileName)){
           Result = proc.th32ProcessID;
           if(Result)
              Process = OpenProcess(PROCESS_ALL_ACCESS, false, Result);
              if(Process){
                 Result = TerminateProcess(Process, 0);
                 CloseHandle(Process);
              }  
        }
     }while(Process32NextW(hSysSnapshot, &proc));
   }
   CloseHandle(hSysSnapshot);
   return (bool)Result;
}

Saludos.

Última edición por escafandra fecha: 14-12-2013 a las 21:37:11.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Terminar proceso aplicacion y dll jconnor82 Varios 2 30-06-2008 04:06:51
Terminar proceso en Windows 2000 RJF Varios 1 26-05-2008 17:29:01
ayuda ejecutando un proceso como "SYSTEM" y haciendo que no se pueda terminar lostprophets Varios 2 05-02-2008 02:28:50
Como Terminar La Ejecucion De Un Proceso kurono Varios 2 01-02-2008 17:10:44
Terminar proceso torito Varios 15 20-04-2007 02:44:36


La franja horaria es GMT +2. Ahora son las 21:50:36.


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
Copyright 1996-2007 Club Delphi