Правильно ли находить хэндл процесса в цикле (вызывать OpenProcess)?

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 5 сен 2011.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Друзья! Короче, ситуация такая. Запуская программу main.exe, Она запрашивает имя процесса pr.exe, КОТОРОГО НЕТ
    После этого программа начинает в цикле этот процесс искать и искать его хэндл, пока не найдёт. Естественно, если процесса нет, то цикл повторяется. После этого я запускаю процесс pr.exe, программа main.exe находит хэндл и выходит из цикла

    Только уж очень большие хэндлы получаются! Смутно догадываюсь, что вызывать OpenProcess в цикле как-то не того... А хэндл ищу так: в цикле вызывается функция, которая делает снимок системы просматривает все процесссы сравнивая их названия с введённым

    Вот код, для простоты многое опустил (получение привилегий отладчиков и прочая)


    Код (Text):
    1. #include <stdio.h>
    2. #include <Windows.h>
    3. #include <Winnt.h>
    4. #include <tlhelp32.h>
    5.  
    6. using namespace std;
    7.  
    8. //Прототип той самой функции которая делает снимок системы и ищет хэндл
    9. HANDLE HandleProcessa (char* szFilename);
    10.  
    11. int main() {
    12.  SetConsoleCP(1251);
    13.  SetConsoleOutputCP(1251);
    14.  
    15.  
    16.  char ima_processa [MAX_PATH];
    17.  printf ("введи имя процесса\n");
    18.  gets (ima_processa);
    19.  
    20.  
    21.  //Так, ищем хэндл процесса. Вот этот цикл. о котором я говорил
    22.  HANDLE h= 0;
    23.  while (!h) {
    24.   h= HandleProcessa (ima_processa);
    25.   printf ("h= %d\n", h);
    26.   if (!h)
    27.    CloseHandle (h);
    28.  }
    29.  
    30.  printf ("h= %d\n", h);
    31.  
    32.  getchar();
    33.  return 0;
    34. }
    35.  
    36.  
    37.  
    38.  
    39. HANDLE HandleProcessa (char* szFilename) {
    40.  HANDLE hProcessSnap;
    41.  PROCESSENTRY32 pe32;
    42.  //Это мы находим дескриптор снимка процессов
    43.  hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    44.  if (hProcessSnap == INVALID_HANDLE_VALUE)
    45.  return false;
    46.  pe32.dwSize = sizeof(PROCESSENTRY32);
    47.  
    48.  do {
    49.   if (!Process32Next(hProcessSnap, &pe32)) // перечисляем процессы
    50.   return FALSE;
    51.  }
    52.  while (lstrcmpi(pe32.szExeFile, szFilename)); // ищем нужный процесс. Его PID будет в поле pe32.th32ProcessID              
    53.  CloseHandle(hProcessSnap);
    54.  
    55.  
    56.  //А вот тут возвращаем хэнл. Вот я не знаю, если хэндл нулевой, надо ли его закрывать и если на
    57.  //до, то где? Я делаю это в вызывающей функции main
    58.  return OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, pe32.th32ProcessID);
    59. };
    В принципе, можно так решить проблему: в цикле не вызывать OpenProcess, а в цикле просто смотреть, существует нужный процесс в системе или нет. Если процесс нашёлся (я го запустил), то выходим из цикла и благополучно ВНЕ цикла вызываем OpenProcess
    ...Но хочется узнать почему не получается представленным способом.
     
  2. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Что конкретно не получается? Что значит "очень большие хэндлы получаются"? А какие они должны быть?
    OpenProcess в цикле вызывать не надо.
    Нулевые хендлы закрывать не надо.
     
  3. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Большие это порядка нескольких тыщ
    А вообще я решил проблему, дело в том, что всякий раз, сделав снимок системы и не найдя нужного процесса, возвращалось FALSE, но дескриптор снимка системы НЕ ЗАКРЫВАЛСЯ!

    Код (Text):
    1. do {
    2.   if (!Process32Next(hProcessSnap, &pe32)) // перечисляем процессы
    3.   return FALSE;
    4.  }
    5.  while (lstrcmpi(pe32.szExeFile, szFilename)); // ищем нужный процесс. Его PID будет в поле pe32.th32ProcessID              
    6.  CloseHandle(hProcessSnap);
    Изменил на:
    Код (Text):
    1. do {
    2.   if (!Process32Next(hProcessSnap, &pe32)) { // перечисляем процессы
    3.    CloseHandle(hProcessSnap);
    4.    return FALSE;
    5.   }
    6.  }
    7.  while (lstrcmpi(pe32.szExeFile, szFilename)); // ищем нужный процесс. Его PID будет в поле pe32.th32ProcessID              
    8.  CloseHandle(hProcessSnap);
    и всё заработало, аккуратненькие хэндлы получаются порядка 80-ти. Да они и раньше были рабочими, но у меня было много-много незакрытых хэндлов системы, что, конечно, плохо.