Узнаем запущен ли процесс, pID, кол-во копий

Участник
Статус
Оффлайн
Регистрация
23 Фев 2017
Сообщения
613
Реакции[?]
507
Поинты[?]
0
В этом гайде я расскажу как узнавать запущен ли процесс, pID, кол-во запущенных копий.

Для работы нам понадобится 2 хедера (остальное опционально):

(так же я указал, что использую пространство имен std)

Теперь надо определиться с каким процессом мы будем работать. Для того чтобы увеличить информативность гайда, я буду работать с процессом, который и будет нашей программой.

Но я не собираюсь вводить переменную с именем процесса, а буду получать его с помощью отдельной функции.

Для начала нам понадобится определить полный путь до нашей программы. Для этого мы будем использовать след. строки:


Но, если мы выведем на экран переменную path, то увидим полный путь. Поэтому нам надо "отрезать" не нужный кусок строки. Для этого будем использовать цикл. Чтобы оптимизировать его, мы будем идти с конца до первого найденного "\", потом запишем его индекс и отрежем строку:


Хочу заметить, что в переменную index_ мы запишем (i+1) , потому что обнаружив слеш, мы не должны его захватывать в "обрезанную" строку. Чтобы его исключить, придется его обрезать с помощью (i+1). Так же можно использовать (++i), потому что в след. строке идет break и нам не важен счетчик. Но вариант (i++) не подойдет, т.к вначале изменится переменная index_ , а уже только потом прибавится единица к счетчику.

Чтобы не париться с еще одним циклом, то просто используем метод взятия подстроки:


Функция целиком:


Теперь перейдем к функциям для определения всего, что есть в названии темы.

Для начала определим PID (Process Id) процесса. Для этого будем использовать "TlHelp32.h".

Для начала опишем функцию:


Теперь начнем заполнять. Для начала сделаем объект класса "PROCESSENTRY32". И сразу же в его поле "dwSize" присвоим sizeof() от PROCESSENTRY32. Для чего мы инициализировали dwSize? - Да вот я и сам не знаю. Так написано на сайте msdn:

Сам код:


Теперь сделаем "снапшот" (от англ. snapshot ‘мгновенный снимок') процессов. После проверим на валидность. Будем исполнять этот трюк через функцию CreateToolhelp32Snapshot. Кстати, один из аргументов, который принимает "флаг" (dwFlags) уже устарел и, как я понял, не используется (взято с msdn, ссылка в конце).
Сам код:

Теперь нам надо сравнивать название каждого процесса с аргументом нашей функции. Для этого будем использовать функцию "strcmp(const char* _Str1, const char* _Str2)".
Сам код:


Вся функция:

// Вначале мы инициализируем наш entry с помощью Process32First , затем бежим по снапшоту и
// сравниваем, если мы нашли копию, то просто возвращаем pID этой копии.

Теперь напишем функцию, которая скажет сколько копий запущено.

Для этого оформил функцию след. образом:


Теперь заведем счетчик и следующим делом оформим эту функцию также, как и предыдущую:


//Обращу ваше внимание на то что теперь в функцию создания снапшота, я передаю
// не TH32CS_SNAPPROCESS , а 0x02, но на самом деле это одно и то же.
//Вы сами можете убедиться:
//


Логически, сейчас мы будем повторять первую функцию, но с маленькими изменениями:


Таким образом, если процесс не запущен, то нам вернется 0 (ноль). А это значит, что мы можем спокойно использовать эту функцию в условных конструкциях. НО, если вам нужно просто проверить на наличие процесса, то лучше использовать первую функцию. Почему? -
Потому что первая функция работает до 1-ого вхождения (т.е, до первого совпадения). А эта функция будет полностью пролистывать снапшот, а значит и работать будет дольше (будет заметно на больших снапшотах).

Функция полностью:


А теперь перейдем к тестам, оформим Main:


А, теперь потестим:

(1 - запущена первым, 2 - вторым)

Как видим, EXE нам показало правильный (видно по титлу консоли).
Но вы спросит: "Почему же pID одинаковый?" - потому что функция procPid работает до первого вхождения.
И количество копий показало нам правильно.

Подвожу итог:

- Для конструкций IF , если надо определить запущен ли процесс, то стоит использовать первую функцию (procPid), пример:


- Для определения кол-во запущенных копий, стоит использовать функцию isProcessRun, пример:


Следующий гайд будет по перечислению окон и под-окон.

Спасибо за внимание.

Ссылки:
-
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Для кого _fullpath ?
 
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Сверху Снизу