[C] Funciones para manejar procesos

Iniciado por .::DoX::., 7 Octubre 2011, 02:20 AM

0 Miembros y 1 Visitante están viendo este tema.

.::DoX::.

Bueno he estado aprendiendo a trabajar en C pero por cuestiones de tiempo lo habia dejado pero ahora que tuve tiempo hice estas simples funciones para manejar procesos de Windows para practicar y aprender  :P.

Procesos.h:

#ifndef __PROCESOS__
#define __PROCESOS__

#include <windows.h>
#include <tlhelp32.h>

int EnumProc();
char **ListarProc();
int obtPid(char* Proc);
int TerminarProc(char* Proc);

#endif


Procesos.cpp

/*
Autor: .::DoX::.
Fecha: 06/10/2011 - 06:00 PM
*/

#include "Procesos.h"
#include <stdlib.h>
#include <string.h>

void wCharToChar(WCHAR *wchar, char* dest);

int EnumProc()
{
int i = -1;
HANDLE hSnap;
PROCESSENTRY32 Proceso;

hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Proceso.dwSize = sizeof(PROCESSENTRY32);
Process32First(hSnap, &Proceso);
do { i++; }while(Process32Next(hSnap, &Proceso));
CloseHandle(hSnap);

return i;
}

char **ListarProc()
{
char** tmp;
char aux[260];
int i = 0;
HANDLE hSnap;
PROCESSENTRY32 Proceso;

hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Proceso.dwSize = sizeof(PROCESSENTRY32);
Process32First(hSnap, &Proceso);

tmp = (char**)malloc(sizeof(char*) * EnumProc());

do{
wCharToChar(Proceso.szExeFile, aux);
tmp[i] = (char*)malloc(sizeof(char) * strlen(aux) + 1);
strcpy(tmp[i], aux);
i++;
}while(Process32Next(hSnap, &Proceso));
CloseHandle(hSnap);

return tmp;
}

void wCharToChar(WCHAR *wchar, char* dest)
{
while(*wchar != '\0')
*dest++ = (char)*wchar++;
*dest = '\0';
}

int obtPid(char* Proc)
{

HANDLE hSnap;
PROCESSENTRY32 Proceso;
char tmp[260];

hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Proceso.dwSize = sizeof(PROCESSENTRY32);
Process32First(hSnap, &Proceso);

do {

wCharToChar(Proceso.szExeFile, tmp);

if (!strcmp(tmp, Proc))
{
CloseHandle(hSnap);
return Proceso.th32ProcessID;
}

} while(Process32Next(hSnap, &Proceso));

CloseHandle(hSnap);
return 0;
}

int TerminarProc(char* Proc)
{

HANDLE hProc;
int Pid = obtPid(Proc);

hProc = OpenProcess(PROCESS_TERMINATE, 0, Pid);
if (hProc)
{
if (TerminateProcess(hProc, 0))
{
CloseHandle(hProc);
return 1;
}
}

CloseHandle(hProc);
return 0;

}



Ejemplo de uso:

#include "Procesos.h"
#include <stdio.h>
#include <stdlib.h>

int main()
{
char **a;

a = ListarProc();

for (int i=0; i<=EnumProc(); i++)
printf("%d - Name: %s - PID: %d\n", i, a[i], obtPid(a[i]));

ShellExecuteA(0, NULL, "C:\\Windows\\notepad.exe", NULL, NULL, 1);
Sleep(1000);

if (TerminarProc("notepad.exe"))
printf("\nEl proceso se termino con exito!");
else
printf("Hubo un error al terminar el proceso!");

getchar();
return 0;
}


La función "ListarProc" lista todos los procesos abiertos y los almacena en un arreglo de cadenas; "obtPid" obtiene el PID del proceso que se le pase; TerminateProc termina el proceso que se le pase.

Salu2

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

dewolo

puede ser que NEW y DELETE llaman por debajo a malloc y free, me parecio haber visto eso en el depurador ....

muy weno el codes pero ponele free , mas si haces mallocs dentro de un bucle con lo cual se asigna memoria continuamente y nunca se libera y el proceso se agranda mucho, aparte cuando cerras el proceso se prduce una excepcion y el sistema operativo lo debe liberar me parece  :xD

Queta

"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.