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 .

Procesos.h:

Código: Seleccionar todo

#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

Código: Seleccionar todo

/*
	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:

Código: Seleccionar todo

#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
Responder

Volver a “Fuentes”