Создание Консольной Утилиты

  • Автор темы llllllllll
  • Дата начала
L

llllllllll

#1
Для получения сведений о системе в ОС Windows используются предустановленные структуры, конструкции и вызовы API-функций. Для решения задачи потребуется подключить заголовочный файл tlhelp32.h.

Ниже приведен исходный код эталонного консольного приложения, написанного в C++ Builder:

//---------------------------------------------------------------------------

#include <vcl.h>
#include <tlhelp32.h>
#include <iostream>
#include <stdio>

#pragma hdrstop

using namespace std;

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{

// разбор командной строки
bool need_total = FALSE;
bool exclude_self = FALSE;

// если встречены флаги -t или -T, то в конце вывода процессов вывести их количество
// если встречены флаги -e или -E, то в ходе выбора процессов не учитываем имя этого процесса
for(int i=0; i<argc; i++) {
if( (strcmp(argv,"-t" )==0 ) || (strcmp(argv,"-T" )==0) ) need_total = TRUE;
if( (strcmp(argv,"-e" )==0 ) || (strcmp(argv,"-E" )==0) ) exclude_self = TRUE;

}

PROCESSENTRY32 P;
HANDLE HS;

// массив строк на 100 записей
char Exename[100][MAX_PATH];



HS = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

P.dwSize = sizeof(PROCESSENTRY32); // задаем размер структуры

int i=0;

// читаем все процессы подряд в структуру P
if (Process32First(HS, &P))
{
do
{

// если указан флаг неотображения самого себя, проверяем, не попалось ли имя программы в прочитанном найденном имени процесса
if( !((exclude_self) && (ExtractFilePath(argv[0])+P.szExeFile == argv[0]))) {

//сохраним имя найденного процесса в массив
for(int j=0; j<MAX_PATH; j++) {Exename[j] = P.szExeFile[j];}

// выведем найденный процесс на экран
cout << Exename << endl;

i++;
}
}
while (Process32Next (HS, &P));
}

if(need_total) cout << endl << "Count: " << i << endl;

return 0;
}
//---------------------------------------------------------------------------


Встреченные в тексте исходника конструкции:

PROCESSENTRY32 P; - структура типа PROCESSENTRY32, являющаяся описанием одного процесса в системе ОС Windows в 32х-разрядном (и во всех совместимых) режиме работы ОС.

HANDLE HS; - Типичный для Windows тип HANDLE – метка какого-нибудь объекта. В даном случае — глобальный идентификатор снимка блоков памяти для нашего процесса. Подробнее — см. литературу о процессах в системе.

Функция CreateToolhelp32Snapshot(DWORD dwFlags, DWORD th32ProcessID) — API-функция создания снимка блоков памяти определенного процесса, возвращающшая типичный для ОС Windows идентификатор объекта HANDLE (аналог указателя).

Функции Process32First и Process32Next — API – функции перебора списка процессов, возвращающие описание процесса в структуру типа PROCESSENTRY32. Из самой структуры в программе используется лишь одно поле - szExeFile, содержащее строку типа char, в которой хранится имя найденного процесса.

Функция ExtractFilePath( argv[0] ) - возвращает строку типа AnsiString, содержащую полный путь до файла exe текущей запущенной программы.

Задания:

1. Откомпилировать исходник программы и запустить из консоли (cmd) программу без параметров, с параметром -t, с параметром -e и с параметрами -t -e сразу. Объяснить различия.
2. Сделать сортировку списка строк Exename по алфавиту (подойдет пузырьком по первой букве, например), затем его вывод в конце программы.
3. Сделать проверку флага командной строки -c, который включал бы подсчет встреченных имен процессов, которые имеют определенное имя (например, svchost.exe), а в конце работы программы выводилось бы количество встреченных совпадений. Для сравнения можно использовать функцию strcmp( P.szExeFile ,"svchost.exe" ), которая вернет 0, если строки совпадают.