2013-04-18 5 views
1

Im пытается получить идентификатор из процесса, используя функцию ниже, однако GetLastError продолжает возвращать ERROR_NO_MORE_FILES, чтобы он никогда не получал возможность перебирать все процессы. Я не уверен, что вызывает это. Есть идеи? Кроме того, в качестве теста я проходил в парах, как «notepad.exe»Ошибка получения идентификатора процесса. «ERROR_NO_MORE_FILES»

int GetProcID(string ProcName){ 
    PROCESSENTRY32 PE32; 
    HANDLE ProcSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 

    PE32.dwSize = sizeof(PROCESSENTRY32); 

    if(!Process32First(ProcSnapshot,&PE32)) 
     return 0; 
    else 
     if(PE32.szExeFile == ProcName) 
      return PE32.th32ProcessID; 
     else 
     { 
      while(GetLastError() != ERROR_NO_MORE_FILES){ 
       Process32Next(ProcSnapshot,&PE32); 
        if(PE32.szExeFile == ProcName) 
         return PE32.th32ProcessID; 
      } 
      return 0; 
     } 
} 
+1

Самое интересное условие в ваших блоках 'if()'. Я не думаю, что вы запустили это в отладчике? – WhozCraig

+0

Вы также просачиваете дескриптор, возвращенный из 'CreateToolhelp32Snapshot()'. Вы можете исправить это, пока вы на нем (или разместите свой * реальный * код, если это не так). – WhozCraig

ответ

2

Вашего while цикл является неправильным. Вы не должны проверять значение ошибки даже перед вызовом функции Process32Next. Ваша функция вернется без каких-либо действий, если предыдущий вызов функции Windows API (возможно, еще одна функция Process32Next) вернул ERROR_NO_MORE_FILES, а имя первого процесса в моментальном снимке - это нечто иное, чем имя, которое вы хотите найти.

Имейте в виду, что не все функции API устанавливают код ошибки ERROR_SUCCESS, даже если они преуспели (а также не забудьте закрыть дескриптор моментального снимка после того, как вы закончите с ним).

+1

Спасибо человек. Используя теперь другой метод проверки для цикла while, он работает. – h4344

Смежные вопросы