Форум программистов, компьютерный форум CyberForum.ru

Как определить, запущен ли процесс? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.97
IcleyNex
1 / 1 / 0
Регистрация: 06.04.2010
Сообщений: 16
06.04.2010, 21:56     Как определить, запущен ли процесс? #1
В результате должно получиться такое:
При запуске exe появляется маленькое окошечко, идёт поиск запущеных процессов (например стандартный калькулятор), и пишется строчка "калькулятор не запущен". Через интервал (5...10сек) проверка повторяется.
Если калькулятор запустили, то в окошке отобразить дополнительно адреса памяти занимаемой калькулятором (первый и последний, или первый и размер занимаемой памяти)
С чего начинать посоветуете? Как можно это реализовать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2010, 21:56     Как определить, запущен ли процесс?
Посмотрите здесь:

C++ Как определить в каком режиме запущен компьютер?
Есть процесс A и дочерний процесс B, который находит хэндл родительского процесса A. И этот хэндл в разных случаях РАЗНЫЙ! Почему? C++
как можно проверить, запущен ли текстовый файл или нет C++
Как не прерывая программу запустить процесс? C++
Как правильно закрыть процесс C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gh05t
47 / 46 / 4
Регистрация: 03.04.2010
Сообщений: 99
07.04.2010, 02:34     Как определить, запущен ли процесс? #2
Перечислить список процессов, найти в списке по имени нужный. Если есть - получить информацию о памяти. Почитай о ToolHelp32 API.

Добавлено через 59 минут
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
#include "tlhelp32.h"
 
bool IsProcessPresent(wchar_t * szExe)
{
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    
    PROCESSENTRY32 pe;
    pe.dwSize = sizeof(PROCESSENTRY32);
    Process32First(hSnapshot, &pe);
 
    if (!_wcsicmp((wchar_t *)&pe.szExeFile, szExe))
    {
        return true;
    }
 
    while (Process32Next(hSnapshot, &pe))
    {
        if (!_wcsicmp((wchar_t *)&pe.szExeFile, szExe))
        {
            return true;
        }       
    }   
 
    return false;
}
IcleyNex
1 / 1 / 0
Регистрация: 06.04.2010
Сообщений: 16
09.04.2010, 17:36  [ТС]     Как определить, запущен ли процесс? #3
Такс. Ничего не понимаю
Если скопипастить это текст, то не компилится, вылезает текст библы tlhelp32.h и слева от typedef struct tagHEAPLIST32 { DWORD dwSize; стоит красный квадратик.
Наверное с малого надо начинать - сколько процессов запущено? Или написать имена всех запущенных процессов (в консоли). Еще желательно на си, хотя может быть очень похоже будет.
Кроме того, где в сети можно почитать про всякие библиотеки? (у меня хелпа нет)
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
09.04.2010, 18:36     Как определить, запущен ли процесс? #4
К изучению.
Эта прога выведет список всех процессов в оси (винда)


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 <stdio.h> 
#include <Windows.h> 
#include <Winnt.h> 
//Здесь определена структура PROCESSENTRY32 и функция CreateToolhelp32Snapshot
#include <tlhelp32.h>
//int main ();
HANDLE HandleProcessa ()  {
 
 HANDLE hProcessSnap;
 PROCESSENTRY32 pe32;
 
 //Это мы находим дескриптор снимка процессов
 hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
 if (hProcessSnap == INVALID_HANDLE_VALUE)
 return false;
 pe32.dwSize = sizeof(PROCESSENTRY32);
 
 FILE *f;
 f = fopen("rezultat.cc","wb");
 
 int i= 0;
 
 while (Process32Next(hProcessSnap, &pe32)) {
  printf ("%d  %s\n",++i,  pe32.szExeFile);
  fprintf(f,"%s \n",pe32.szExeFile);
 } 
 
 
 fclose (f);
 CloseHandle(hProcessSnap);
 
 
}
 int main () {
  HandleProcessa ();
  getchar ();
  return 0;
 }
gh05t
47 / 46 / 4
Регистрация: 03.04.2010
Сообщений: 99
11.04.2010, 05:46     Как определить, запущен ли процесс? #5
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
#include <windows.h>
#include <iostream>
#include <tlhelp32.h>
 
using namespace std;
 
bool IsProcessPresent(wchar_t * szExe)
{
        HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        
        PROCESSENTRY32 pe;
        pe.dwSize = sizeof(PROCESSENTRY32);
        Process32First(hSnapshot, &pe);
 
        if (!_wcsicmp((wchar_t *)&pe.szExeFile, szExe))
        {
                return true;
        }
 
        while (Process32Next(hSnapshot, &pe))
        {
                if (!_wcsicmp((wchar_t *)&pe.szExeFile, szExe))
                {
                        return true;
                }               
        }       
 
        return false;
}
 
int main()
{
        TCHAR szExe[] = L"calc.exe";
        while (1)
        {
                if (IsProcessPresent((wchar_t *)&szExe))
                {
                        wcout << szExe << L" present" << endl;
 
                        //добавляй получение и вывод информации о памяти
                }
                else
                {
                        wcout << szExe << L" not present" << endl;
                }
                Sleep (3000);
        }
        return 0;
}
IcleyNex
1 / 1 / 0
Регистрация: 06.04.2010
Сообщений: 16
13.04.2010, 00:32  [ТС]     Как определить, запущен ли процесс? #6
Ага. Что я наковырял.
Сначала ковырял список всех процессов. Добавил глобальную текстовую calc.exe и сравнивал с запущенными, как то так: if ( 0 == strcmp(pe32.szExeFile,TargetProc) )... Потом убрал вывод списка и файла, и оставил сообщения "работает" или "не работает" (проверка в main функции). Проблема в том, что работает однократно.
Сейчас увидел второй вариант, где проверка идёт всегда, с интервалом 3 секунды. (Беда в том, что.. ах да, подключил <iostream> и пауза заработала). Так же увидел бесконечную проверку.

Теперь мне нужно найти id процесса и информацию о памяти (чтоб потом её можно было читать). Подскажите плиз команды?
gh05t
47 / 46 / 4
Регистрация: 03.04.2010
Сообщений: 99
13.04.2010, 00:54     Как определить, запущен ли процесс? #7
pe.th32ProcessID - PID
Для получения инфы о памяти посмотри функцию VirtualQueryEx. Первый параметр у нее как раз PID, а дальше указатель на блок памяти, информацию о которой хочешь получить. Вообще виртуальная память хорошо описана у Рихтера, почитай, много, но это самые азы. И написано доступно.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
13.04.2010, 17:00     Как определить, запущен ли процесс? #8
Цитата Сообщение от IcleyNex Посмотреть сообщение
Теперь мне нужно найти id процесса
Довольно несложно.
Посмотри, gh05t и я используем структуру
PROCESSENTRY32
Инфу об этой структуре можно где-нибудь почитать. Я сильно не искал, но вот, например:
http://www.realcoding.net/article/view/836

Как видишь, поле
PROCESSENTRY32.th32ProcessID искомое, как уже было подмечено.
IcleyNex
1 / 1 / 0
Регистрация: 06.04.2010
Сообщений: 16
14.04.2010, 15:33  [ТС]     Как определить, запущен ли процесс? #9
Вначале запихал в список процессов строчку printf (" %4d\n", pe32.th32ProcessID); и рядом с именем стал появляться ID.

Затем в "ловилке" добавил переменную, в условие добавил
ProcRabotaet=true;
ProcID=pe32.th32ProcessID;
return(0);

и в конце вывод printf ("Process %s rabotaet, ID=%d \r",TargetProc,ProcID);
Работает вроде нормально, калькулятор запускаю\закрываю и только при запущеном кальке выдаёт ID (всегда разный). выглядит примерно так: http://s61.***********/i171/1004/6e/bb83cd9e6692.png

Сейчас надо научиться определять адреса памяти - начало и конец (или начало и общая занимаемая память). Какие команды искать? (VirtualQueryEx уже ищу) Ещё подсказали ReadProcessMemory. Хотя для чтения из памяти надо будет создать новую тему.

Добавлено через 28 минут
http://wm-help.net/books-online/book/59464.html - это та самая книга Рихрета? В онлайне нашел. Главы 13...18 про память.
gh05t
47 / 46 / 4
Регистрация: 03.04.2010
Сообщений: 99
14.04.2010, 15:52     Как определить, запущен ли процесс? #10
Да, книга та.
По поводу памяти. Вот код, который получает информацию о всей памяти, доступной процессу из юзер-мода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    SYSTEM_INFO si;
    GetSystemInfo(&si);
    PVOID p = si.lpMinimumApplicationAddress;
 
    MEMORY_BASIC_INFORMATION mbi;
    ZeroMemory(&mbi, sizeof(MEMORY_BASIC_INFORMATION));
           //здесь вместо GetCurrentProcessId() - ставь свой PID калькулятора
    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, GetCurrentProcessId());
    
    while(p < si.lpMaximumApplicationAddress)
    {
        VirtualQueryEx(hProcess, p, &mbi, sizeof(MEMORY_BASIC_INFORMATION));
        
        //теперь в mbi - информация о регионе памяти. Делай с ней то, что тебе надо
        
        p = (PVOID)((SIZE_T)p + mbi.RegionSize);
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2010, 18:42     Как определить, запущен ли процесс?
Еще ссылки по теме:

C++ Как запустить процесс с параметрами
C++ Процесс А инициализирует массив случайными значениями и записывает их в файл, а затем запускает процесс Б
C++ Как убить процесс запускаемый spawnl

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

Или воспользуйтесь поиском по форуму:
IcleyNex
1 / 1 / 0
Регистрация: 06.04.2010
Сообщений: 16
15.04.2010, 18:42  [ТС]     Как определить, запущен ли процесс? #11
Почитал про память. Опять в ступоре
Оказывается выделяется всегда четыре (два для проги) гига. На физическую память они проецируются малыми кусками (у калькулятора почти 250 кусков). А куски расположены на страницах. Понял что искать нужно в Commit страницах, так как там находятся данные. В общем чем дальше тем страшнее (особенно плохо разбираясь в коде )
Что делать то? http://x3dgames.narod.ru/inform/gdsrc.html вот тут какой то пример чтения памяти. Наверное оно мне подойдёт? Только всё равно не понятно и надо будет очень сильно изучать его.

Добавлено через 41 минуту
Наверное тему можно сворачивать. Итог: научились искать процесс по его имени и определять его ID. Проверка идёт постоянно, через секунду. Код явно кривущщий, потому как я начинающий, но он работает. Для изучения памяти создам новую тему. Всем спасибо, кипение мозгов продолжается.
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
51
#include <stdio.h>
#include <Windows.h>
#include <iostream>
#include <Winnt.h>
#include <string.h> // для сравнения строковых переменных
//Здесь определена структура PROCESSENTRY32 и функция CreateToolhelp32Snapshot
#include <tlhelp32.h>
//int main ();
//----------------------------------------------------------
 char TargetProc[] = "calc.exe";// имя процесса который ищем
 bool ProcRabotaet=0;
 int ProcID;
 //----------------------------------------------------------
HANDLE HandleProcessa ()  {
 HANDLE hProcessSnap;
 PROCESSENTRY32 pe32;
 //Это мы находим дескриптор снимка процессов
 hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 if (hProcessSnap == INVALID_HANDLE_VALUE)
 return false;
 pe32.dwSize = sizeof(PROCESSENTRY32);
 int i= 0;
 while (Process32Next(hProcessSnap, &pe32)) {
 
  if ( 0 == strcmp(pe32.szExeFile,TargetProc) )
  {      ProcRabotaet=true;
          ProcID=pe32.th32ProcessID;
          return(0);
          }
     else  ProcRabotaet=false;
 }
 CloseHandle(hProcessSnap);
}
 
 int main () {
     printf ("Poisk processa: %s\n",TargetProc);
          while(1){
     HandleProcessa ();
  if (ProcRabotaet==1)
  {
    printf ("Process %s rabotaet, ID=%d  \r",TargetProc,ProcID);
  }
  else
  {
    printf ("Process %s NE zapushen      \r",TargetProc);
  }
  Sleep (1000);
  }
  getchar ();
  return 0;
 }
Yandex
Объявления
15.04.2010, 18:42     Как определить, запущен ли процесс?
Ответ Создать тему
Опции темы

Текущее время: 17:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru