Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 15.05.2014
Сообщений: 51

Как получить информацию о процессах через API?

20.09.2015, 20:26. Показов 4405. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, мне нужно написать программу для получения информации о процессах (имя, потоки, волокна, ID, приоритет и т.д.) не подскажете, как можно это сделать? Пытался использовать ToolHelp32, но не знаю как получить приоритет, список потоков и волокон. А ещё не пойму как использовать поле szExeFile. Вроде с его помощью можно получить имя процесса, но не пойму как (при выводе через cout выводит одно и то же шестнадцатиричное число (походу адрес), а через printf выводит только один символ). Если подскажете, в чём проблема, буду очень благодарен.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <Windows.h>
#include <tlhelp32.h>
#include <iostream>
using namespace std;
 
HANDLE PrintProcesses()
{
    HANDLE hProcessSnap;
 PROCESSENTRY32 pe32;
 
 hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
 if (hProcessSnap == INVALID_HANDLE_VALUE)
 return false;
 pe32.dwSize = sizeof(PROCESSENTRY32);
 
 while (Process32Next(hProcessSnap, &pe32)) {
  printf ("pe32.dwSize= %x\n", pe32.dwSize);
  printf ("pe32.cntUsage= %x\n", pe32.cntUsage);
  printf ("pe32.th32ProcessID= %x\n", pe32.th32ProcessID);
  printf ("pe32.th32DefaultHeapID= %x\n", pe32.th32DefaultHeapID);
  printf ("pe32.th32ModuleID= %x\n", pe32.th32ModuleID);
  printf ("pe32.cntThreads= %x\n", pe32.cntThreads);
  printf ("pe32.th32ParentProcessID= %x\n", pe32.th32ParentProcessID);
  printf ("pe32.pcPriClassBase= %x\n", pe32.pcPriClassBase);
  printf ("pe32.dwFlags= %x\n", pe32.dwFlags);
  printf ("pe32.szExeFile= %s\n\n", pe32.szExeFile);
} 
 
 CloseHandle(hProcessSnap);
}
 
int main()
{
    HANDLE CONST hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    PrintProcesses();
    cin.get();
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.09.2015, 20:26
Ответы с готовыми решениями:

Получить информацию о выполняющихся процессах
Не нашёл ни одного рабочего способа для Билдера. Наименее геморройный ToolHelp32, но всё что он даёт - это два поля: ID и name. И то он так...

Как получить информацию от API на Azure?
Всем привет. Пытаюсь получить информацию от api на azure и ничего не выходит. Умельцы и знатоки подскажите что не так делаю: Создал класс...

Steam API - как можно получить медиану цен через API?
Ребят, как можно получить медиану цен через API ? Интересует количество продаж за последний день. Инфу по предмету получаю таким...

4
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
20.09.2015, 20:49
Цитата Сообщение от Shiman_Gleb Посмотреть сообщение
А ещё не пойму как использовать поле szExeFile.
Я бы рекомендовал использовать Process32First, как сказано здесь: https://msdn.microsoft.com/ru-... 85%29.aspx
к ознакомлению

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdio.h> 
#include <windows.h> 
//#include <Winnt.h> 
#include <tlhelp32.h>
FILE *f;
bool SpisokProcessov ()  {
 
 HANDLE hProcessSnap;
 PROCESSENTRY32 pe32;
 
 //Это мы находим дескриптор снимка процессов
 hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
 if (hProcessSnap == INVALID_HANDLE_VALUE)
 return false;
 pe32.dwSize = sizeof(PROCESSENTRY32);
 
 
 int i= 0;
 
 //
 
 Process32First(hProcessSnap, &pe32);
 printf ("%d  PID= %x   %s   %d\n",++i, pe32.th32ProcessID, pe32.szExeFile, pe32.th32ParentProcessID);
 fprintf(f,"%d  PID= %x   %s   %d\n",i, pe32.th32ProcessID, pe32.szExeFile, pe32.th32ParentProcessID);
 while (Process32Next(hProcessSnap, &pe32)) {
  printf ("%d  PID= %x  %s   PID родителя %d\n",++i, pe32.th32ProcessID, pe32.szExeFile, pe32.th32ParentProcessID );
  fprintf(f,"%d  PID= %x   %s   PID родителя %d\n",i, pe32.th32ProcessID, pe32.szExeFile, pe32.th32ParentProcessID);
 } 
 
 
 CloseHandle(hProcessSnap);
 return true;
}
 
 
 
 int main () {
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 
 
 f = fopen("rezultat.txt","wb");
 
 //Если циклом не хочешь, надо закомментить эту херь
 //while (true) 
  SpisokProcessov ();
 fclose (f);
  getchar ();
  return 0;
 }


Добавлено через 7 минут
Что же касается списка потоков, не вижу попытки их получить. Аналогично смотрим функцию Thread32Next, не забываем использовать Thread32First, ну и структуру смотрим, которую заполняет Thread32Next, там тебе и приоритет, и TID, и PID процесс-владельца.
0
0 / 0 / 0
Регистрация: 15.05.2014
Сообщений: 51
20.09.2015, 21:04  [ТС]
Спасибо за ответ, только не пойму: использовав Ваш пример, получил следующий результат:
1 PID= 0 [ 0
2 PID= 4 S PID [ 0
3 PID= 184 s PID родителя 4
4 PID= 238 a PID родителя 516
5 PID= 25c a PID родителя 568
6 PID= 4e4 c PID родителя 1056
7 PID= 528 w PID родителя 1056
8 PID= 594 s PID родителя 1320
9 PID= 59c l PID родителя 1320
10 PID= 5e4 s PID родителя 1428
Это первые десять строк, там их больше, но не в этом суть. В третьей строке, где по одному символу, так и должно быть? И ещё: это в потоках можно получить информацию о волокнах (не уверен, так ли это переводится. На английском это "fiber").
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
20.09.2015, 21:24
Цитата Сообщение от Shiman_Gleb Посмотреть сообщение
Это первые десять строк, там их больше, но не в этом суть. В третьей строке, где по одному символу, так и должно быть?
нет, тут что-то не то. Должны быть полные имена процессов, примерно так:

Bash
1
2
3
4
5
6
7
8
9
10
1  PID= 0   [System Process]   0
2  PID= 4  System   PID родителя 0
3  PID= 27c  smss.exe   PID родителя 4
4  PID= 2a8  avgrsx.exe   PID родителя 668
5  PID= 2d4  avgcsrvx.exe   PID родителя 680
6  PID= 3e4  csrss.exe   PID родителя 636
7  PID= 43c  winlogon.exe   PID родителя 636
8  PID= 468  services.exe   PID родителя 1084
9  PID= 484  lsass.exe   PID родителя 1084
и так далее
А что не то, я не могу сказать. pe32.szExeFile суть указатель на строку с именем процесса, второй байт которой ни с того ни с сего вдруг становится нулевым.

На своём компе я бы предположил следущее: как мы знаем Process32Next смуществует как бы в двух ипостасях: для юникода (Process32NextW) и не для юникода (Process32Next). Если предположить, что у тебя вызывается Process32NextW, то, соответственно она принимает указатель на структуру:

C++
1
2
3
4
5
6
7
8
9
10
11
12
typedef struct tagPROCESSENTRY32W {
    DWORD dwSize;
    DWORD cntUsage;
    DWORD th32ProcessID;
    DWORD th32DefaultHeapID;
    DWORD th32ModuleID;
    DWORD cntThreads;
    DWORD th32ParentProcessID;
    LONG pcPriClassBase;
    DWORD dwFlags;
    WCHAR szExeFile[MAX_PATH];
} PROCESSENTRY32W,*PPROCESSENTRY32W,*LPPROCESSENTRY32W;
Видишь WCHAR szExeFile[MAX_PATH];? Каждый символ занимает два байта! Второй нулевой. Значит, попробуй для вывода нужную функцию с буквой w, вот так что ли:

C++
1
 wprintf ("%d  PID= %x   %s   %d\n",++i, pe32.th32ProcessID, pe32.szExeFile, pe32.th32ParentProcessID);
1
0 / 0 / 0
Регистрация: 15.05.2014
Сообщений: 51
20.09.2015, 21:54  [ТС]
Действительно, теперь работает. Большое спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.09.2015, 21:54
Помогаю со студенческими работами здесь

Создать файл JSON или как получить информацию от api
Доброго времени суток. Возник вопрос парсинга (сбора данных с сайтов). Я так понимаю, чтоб получить данные с сайтов нужно иметь доступ к...

Передать информацию обо все активных процессах в системе через межпроцессный канал в параллельный процесс
Добрый вечер, уважаемые господа программисты! Помогите, пожалуйста, исправить ошибку в цикле! Задание у меня следующее: Передать...

Как вывести информацию о процессах, PID которых больше заданного?
Есть следующая задача: Сгенерировать следующую информацию о m (m&gt;2) процессах системы, имеющих значение идентификатора больше...

Как получить информацию с Яндекса через file_get_contents
Как получить информацию с Яндекса через file_get_contents для получения 50 урлов для личных целей, но при запросе вылазиет страница ...

Steam API получить информацию о предмете
Если кто-то работал со Steam API, то подскажите, как можно получить информацию о предмете, зная его ID? Добавлено через 8 минут ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru