 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
el diego Master


Registrado: 23 Ago 2002Mensajes: 232Ubicación: Paris
|
Publicado: Mar 15 Jul, 2003 3:21 pm Asunto: Un KILLPROCESS: |
|
|
Util para matar alguna tarea rebelde, que inciste en su lucha contra el inevitable final. Espero que le sirva a alguien.
Declaraciones: | Código: | #include <windows.h>
#include <tlhelp32.h>
#include <iostream.h>
#include <string.h>
#include <ctype.h>
int KILL_PROC_BY_NAME(const char *); //Declaracion de la funcion
|
Ejemplo de utilizacion:
| Código: |
// Terminar un proceso activo
char szName[100]="iexplore.exe"; // Nombre del proceso a liquidar
int iRes;
iRes=KILL_PROC_BY_NAME(szName);
cout << "Result code=" << iRes << endl;
|
La funcion:
| Código: | int KILL_PROC_BY_NAME(const char *szToTerminate)
{
BOOL bResult,bResultm;
DWORD aiPID[1000],iCb=1000,iNumProc,iV2000=0;
DWORD iCbneeded,i,iFound=0;
char szName[MAX_PATH],szToTermUpper[MAX_PATH];
HANDLE hProc,hSnapShot,hSnapShotm;
OSVERSIONINFO osvi;
HINSTANCE hInstLib;
int iLen,iLenP,indx;
HMODULE hMod;
PROCESSENTRY32 procentry;
MODULEENTRY32 modentry;
// Transfer Process name into "szToTermUpper" and
// convert it to upper case
iLenP=strlen(szToTerminate);
if(iLenP<1 || iLenP>MAX_PATH) return 632;
for(indx=0;indx<iLenP;indx++)
szToTermUpper[indx]=toupper(szToTerminate[indx]);
szToTermUpper[iLenP]=0;
// PSAPI Function Pointers.
BOOL (WINAPI *lpfEnumProcesses)( DWORD *, DWORD cb, DWORD * );
BOOL (WINAPI *lpfEnumProcessModules)( HANDLE, HMODULE *,
DWORD, LPDWORD );
DWORD (WINAPI *lpfGetModuleBaseName)( HANDLE, HMODULE,
LPTSTR, DWORD );
// ToolHelp Function Pointers.
HANDLE (WINAPI *lpfCreateToolhelp32Snapshot)(DWORD,DWORD) ;
BOOL (WINAPI *lpfProcess32First)(HANDLE,LPPROCESSENTRY32) ;
BOOL (WINAPI *lpfProcess32Next)(HANDLE,LPPROCESSENTRY32) ;
BOOL (WINAPI *lpfModule32First)(HANDLE,LPMODULEENTRY32) ;
BOOL (WINAPI *lpfModule32Next)(HANDLE,LPMODULEENTRY32) ;
// First check what version of Windows we're in
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
bResult=GetVersionEx(&osvi);
if(!bResult) // Unable to identify system version
return 606;
// At Present we only support Win/NT/2000/XP or Win/9x/ME
if((osvi.dwPlatformId != VER_PLATFORM_WIN32_NT) &&
(osvi.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS))
return 607;
if(osvi.dwPlatformId==VER_PLATFORM_WIN32_NT)
{
// Win/NT or 2000 or XP
// Load library and get the procedures explicitly. We do
// this so that we don't have to worry about modules using
// this code failing to load under Windows 9x, because
// it can't resolve references to the PSAPI.DLL.
hInstLib = LoadLibraryA("PSAPI.DLL");
if(hInstLib == NULL)
return 605;
// Get procedure addresses.
lpfEnumProcesses = (BOOL(WINAPI *)(DWORD *,DWORD,DWORD*))
GetProcAddress( hInstLib, "EnumProcesses" ) ;
lpfEnumProcessModules = (BOOL(WINAPI *)(HANDLE, HMODULE *,
DWORD, LPDWORD)) GetProcAddress( hInstLib,
"EnumProcessModules" ) ;
lpfGetModuleBaseName =(DWORD (WINAPI *)(HANDLE, HMODULE,
LPTSTR, DWORD )) GetProcAddress( hInstLib,
"GetModuleBaseNameA" ) ;
if(lpfEnumProcesses == NULL ||
lpfEnumProcessModules == NULL ||
lpfGetModuleBaseName == NULL)
{
FreeLibrary(hInstLib);
return 700;
}
bResult=lpfEnumProcesses(aiPID,iCb,&iCbneeded);
if(!bResult)
{
// Unable to get process list, EnumProcesses failed
FreeLibrary(hInstLib);
return 701;
}
// How many processes are there?
iNumProc=iCbneeded/sizeof(DWORD);
// Get and match the name of each process
for(i=0;i<iNumProc;i++)
{
// Get the (module) name for this process
strcpy(szName,"Unknown");
// First, get a handle to the process
hProc=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,
aiPID[i]);
// Now, get the process name
if(hProc)
{
if(lpfEnumProcessModules(hProc,&hMod,sizeof(hMod),&iCbneeded) )
{
iLen=lpfGetModuleBaseName(hProc,hMod,szName,MAX_PATH);
}
}
CloseHandle(hProc);
if(strcmp(strupr(szName),szToTermUpper)==0)
{
// Process found, now terminate it
iFound=1;
// First open for termination
hProc=OpenProcess(PROCESS_TERMINATE,FALSE,aiPID[i]);
if(hProc)
{
if(TerminateProcess(hProc,0))
{
// process terminated
CloseHandle(hProc);
FreeLibrary(hInstLib);
return 0;
}
else
{
// Unable to terminate process
CloseHandle(hProc);
FreeLibrary(hInstLib);
return 602;
}
}
else
{
// Unable to open process for termination
FreeLibrary(hInstLib);
return 604;
}
}
}
}
if(osvi.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
{
// Win/95 or 98 or ME
hInstLib = LoadLibraryA("Kernel32.DLL");
if( hInstLib == NULL )
return 702;
// Get procedure addresses.
// We are linking to these functions of Kernel32
// explicitly, because otherwise a module using
// this code would fail to load under Windows NT,
// which does not have the Toolhelp32
// functions in the Kernel 32.
lpfCreateToolhelp32Snapshot=
(HANDLE(WINAPI *)(DWORD,DWORD))
GetProcAddress( hInstLib,
"CreateToolhelp32Snapshot" ) ;
lpfProcess32First=
(BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32))
GetProcAddress( hInstLib, "Process32First" ) ;
lpfProcess32Next=
(BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32))
GetProcAddress( hInstLib, "Process32Next" ) ;
lpfModule32First=
(BOOL(WINAPI *)(HANDLE,LPMODULEENTRY32))
GetProcAddress( hInstLib, "Module32First" ) ;
lpfModule32Next=
(BOOL(WINAPI *)(HANDLE,LPMODULEENTRY32))
GetProcAddress( hInstLib, "Module32Next" ) ;
if( lpfProcess32Next == NULL ||
lpfProcess32First == NULL ||
lpfModule32Next == NULL ||
lpfModule32First == NULL ||
lpfCreateToolhelp32Snapshot == NULL )
{
FreeLibrary(hInstLib);
return 703;
}
// The Process32.. and Module32.. routines return names in all uppercase
// Get a handle to a Toolhelp snapshot of all the systems processes.
hSnapShot = lpfCreateToolhelp32Snapshot(
TH32CS_SNAPPROCESS, 0 ) ;
if( hSnapShot == INVALID_HANDLE_VALUE )
{
FreeLibrary(hInstLib);
return 704;
}
// Get the first process' information.
procentry.dwSize = sizeof(PROCESSENTRY32);
bResult=lpfProcess32First(hSnapShot,&procentry);
// While there are processes, keep looping and checking.
while(bResult)
{
// Get a handle to a Toolhelp snapshot of this process.
hSnapShotm = lpfCreateToolhelp32Snapshot(
TH32CS_SNAPMODULE, procentry.th32ProcessID) ;
if( hSnapShotm == INVALID_HANDLE_VALUE )
{
CloseHandle(hSnapShot);
FreeLibrary(hInstLib);
return 704;
}
// Get the module list for this process
modentry.dwSize=sizeof(MODULEENTRY32);
bResultm=lpfModule32First(hSnapShotm,&modentry);
// While there are modules, keep looping and checking
while(bResultm)
{
if(strcmp(modentry.szModule,szToTermUpper)==0)
{
// Process found, now terminate it
iFound=1;
// First open for termination
hProc=OpenProcess(PROCESS_TERMINATE,FALSE,procentry.th32ProcessID);
if(hProc)
{
if(TerminateProcess(hProc,0))
{
// process terminated
CloseHandle(hSnapShotm);
CloseHandle(hSnapShot);
CloseHandle(hProc);
FreeLibrary(hInstLib);
return 0;
}
else
{
// Unable to terminate process
CloseHandle(hSnapShotm);
CloseHandle(hSnapShot);
CloseHandle(hProc);
FreeLibrary(hInstLib);
return 602;
}
}
else
{
// Unable to open process for termination
CloseHandle(hSnapShotm);
CloseHandle(hSnapShot);
FreeLibrary(hInstLib);
return 604;
}
}
else
{ // Look for next modules for this process
modentry.dwSize=sizeof(MODULEENTRY32);
bResultm=lpfModule32Next(hSnapShotm,&modentry);
}
}
//Keep looking
CloseHandle(hSnapShotm);
procentry.dwSize = sizeof(PROCESSENTRY32);
bResult = lpfProcess32Next(hSnapShot,&procentry);
}
CloseHandle(hSnapShot);
}
if(iFound==0)
{
FreeLibrary(hInstLib);
return 603;
}
FreeLibrary(hInstLib);
return 0;
} |
Informacion adicional: http://www.neurophys.wisc.edu/ravi/software/ |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mie 14 Abr, 2004 6:27 pm Asunto: |
|
|
Esta interesante tu codigo, se ve analizando a fondo funciona tambien para win 9x, y nt, si puedes ponerlo en Tips y Trucos, con expliaciones seria fabuloso _________________
 |
|
| Volver arriba |
|
 |
XyVy Master


Registrado: 25 Ago 2002Mensajes: 557Ubicación: Murcia (España)
|
Publicado: Lun 06 Sep, 2004 9:24 am Asunto: |
|
|
El diego estoy usando tu código en uno de mis programas, y me encuentro con que estableces el valor de iLen a cierto valor pero despues no usas para nada esta variable, puede ser que sea iLenP ? o son cosas distintas ?
También me sucede con variables como iV2000 e iFound.
Ciao. _________________ OJO!! Ya tenemos subforo de Bases de Datos!!
Gracias a los admins. |
|
| Volver arriba |
|
 |
el diego Master


Registrado: 23 Ago 2002Mensajes: 232Ubicación: Paris
|
Publicado: Mar 07 Sep, 2004 8:30 am Asunto: |
|
|
Hola XyVy. Podes comentarlas si no pensas hacer un debug y quieras ver los valores.
saludos
diego |
|
| Volver arriba |
|
 |
XyVy Master


Registrado: 25 Ago 2002Mensajes: 557Ubicación: Murcia (España)
|
Publicado: Mar 07 Sep, 2004 1:09 pm Asunto: |
|
|
Me lo imaginaba, pero bueno te lo postee como comentario.
Ciao y gracias por la función funciona estupendamente. _________________ OJO!! Ya tenemos subforo de Bases de Datos!!
Gracias a los admins. |
|
| Volver arriba |
|
 |
ElCangri Cdt

Registrado: 20 May 2005Mensajes: 19Ubicación: bolivia
|
Publicado: Vie 02 Dic, 2005 4:06 pm Asunto: hola ayuda |
|
|
disculpen pero soy nuevo en esto en que unit pego este codigo en la .h o en la .cpp `por favor me pueden ayudar con esto espero sus repuestas byeeeee _________________ Retroceder Nunca....Rendirse Jamas!!!! |
|
| Volver arriba |
|
 |
Cri_sys Master


Registrado: 13 Feb 2004Mensajes: 198Ubicación: Maringá, Brazil
|
Publicado: Mar 16 Oct, 2007 2:49 pm Asunto: |
|
|
Hola muy bueno el codigo, sirve para todos los sistemas operativos!!
Hice uno muy sencillo, que sirve hasta ahora perfecto excepto creo en NT. Es el que uso en mis aplicaciones para WinXP.
| Código: | #include <tlhelp32>
int KillTask(String FileName)
{
bool ContinueLoop;
HANDLE FSnapshotHandle;
PROCESSENTRY32 FProcessEntry32;
FSnapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize = sizeof(FProcessEntry32);
ContinueLoop = Process32First(FSnapshotHandle, &FProcessEntry32);
while (ContinueLoop)
{
if ( (UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) == UpperCase(FileName))
|| (UpperCase(FProcessEntry32.szExeFile) == UpperCase(FileName)) )
{
return TerminateProcess(
OpenProcess(PROCESS_TERMINATE, 0, FProcessEntry32.th32ProcessID),
0);
}
ContinueLoop = Process32Next(FSnapshotHandle, &FProcessEntry32);
}
CloseHandle(FSnapshotHandle);
return 0;
} |
Espero que les srive
Salu2 _________________ Read what I mean, not what I write! |
|
| Volver arriba |
|
 |
Cri_sys Master


Registrado: 13 Feb 2004Mensajes: 198Ubicación: Maringá, Brazil
|
Publicado: Mar 16 Oct, 2007 6:08 pm Asunto: |
|
|
Lo siento en el mensaje anterior coloqué que en NT, pero de hecho no funciona en 98 que es el no contiene el dll que este utiliza..
es decir puede ser usado en Win/NT/2000/XP que son los que hacen uso de la libreria "PSAPI.DLL", Win/9x/ME las contiene en el popular Kernel32.dll
Salu2 _________________ Read what I mean, not what I write! |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 16 Oct, 2007 6:46 pm Asunto: |
|
|
| Cri_sys escribió: | | no funciona en 98 |
Yo la probé hace tiempo en Windows 95 y 98 y si que funciona:
https://cppbuilder.es/viewtopic.php?t=997
Según la referencia del API funcionaria con cualquier versión de Windows excepto NT: CreateToolhelp32Snapshot
Aunque instalando la librería PSAPI.DLL que también está disponible para NT 3.51 y 4.0 funcionaria (o instalando el kit de recursos de NT que entre otras cosas instala esa librería). |
|
| Volver arriba |
|
 |
el diego Master


Registrado: 23 Ago 2002Mensajes: 232Ubicación: Paris
|
Publicado: Mie 17 Oct, 2007 10:36 am Asunto: |
|
|
Gracias! Voy a ver si en algun momento de tiempo libre lo pruebo.
saludos |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|