Занятия разрушают способность к созиданию
Введение.
Я хочу рассказать о технологии Tool Help 32, позволяющей
работать с процессами. Это, пожалуй, самое удобное средство для работы с процессами
в операционных системах семейства Windows. Все прототипы функций и структуры
находятся в одном заголовочном файле, технология хорошо документированна, и при грамотном использовании
может служить хорошим инструментом программиста. Мы рассмотрим только работу с
процессами, но, я думаю, что просмотрев файл tlhelp32.h и почитав статьи в MSDN
или в Platform SDK вы легко найдёте всю необходимую для себя информацию.
Tlhelp32.h - основа Tool Help.
В этом файле находятся прототипы функций и структуры. Для работы с процессами
сначала нам нужно получить дескриптор. Для этого мы используем функцию
CreateToolhelp32Snapshot:
HANDLE
WINAPI
CreateToolhelp32Snapshot(
DWORD dwFlags,
DWORD th32ProcessID
);
Переменная dwFlags может принимать следующие значения:TH32CS_SNAPHEAPLIST TH32CS_SNAPMODULE TH32CS_SNAPPROCESS TH32CS_SNAPTHREADТеперь мы можем начать работать с этим "снимком" через дескриптор. Нам необходимо создать переменную типа PROCESSENTRY32 (структура, поля можо посмотреть в файле tlhelp32.h). Для того, чтобы заполнить эту структуру значениями запущенных процессов надо вызвать функцию Process32First:
BOOL
WINAPI
Process32First(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe
);
Для дальнейшего получения списка мы ипользуем другую функцию - Process32Next:
BOOL
WINAPI
Process32Next(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe
);
Этой информации хватит для написания простейшей консольной программы,
перечисляющей процессы, чем мы сейчас и займёмся. Хотя функции Tool Help 32 этим
далеко не ограничены, т.к. с её помощью мы можем получать не только список процессов, но
и список потоков, нитей, и модулей данного процесса.
Пример:
#include <windows.h>
#include <tlhelp32.h> //Все функции Tool Help 32 в этом файле
#include <iostream>
using namespace std;
void main()
{
cout << "Example by zlyden. Using Tool Help 32" << endl;
PROCESSENTRY32 process; //Структура в которой будут записаны свойства процессов
HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
//TH32CS_SNAPPROCESS для получения списка процессов
Process32First(hSnap,&process);
while (Process32Next(hSnap,&process))
cout << process.szExeFile << endl; //szExeFile содержит имя процесса
CloseHandle(hSnap);
}
Исходник и скомпилированную программу вы можете найти в разделе
Программы в виде архива.В статье использована информация из MSDN и tlhelp32.h
Dmitri Alenitchev, Copyright © 2004