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

Тема в разделе "C/C++/C#", создана пользователем llllllllll, 12 мар 2012.

  1. llllllllll

    llllllllll Гость

    Для получения сведений о системе в ОС 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, если строки совпадают.
     
Загрузка...

Поделиться этой страницей