2016-03-09 1 views
1
#include <windows.h> 
#include <tlhelp32.h> 
#include <iostream> 

using namespace std; 

void GetProcId(); 

DWORD ProcId = 0; 

int main() 
{ 

GetProcId(); 
printf("%d", ProcId); 
cin.get(); 
return 0; 
} 

void GetProcId() 
{ 
    PROCESSENTRY32 pe32; 
    HANDLE   hSnapshot = NULL; 

    pe32.dwSize = sizeof(PROCESSENTRY32); 
    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 

    if(Process32First(hSnapshot, &pe32)) 
    { 
     do{ 
      if(strcmp(pe32.szExeFile, "s.exe") == 0) 
       break; 
     }while(Process32Next(hSnapshot, &pe32)); 
    } 

    if(hSnapshot != INVALID_HANDLE_VALUE) 
     CloseHandle(hSnapshot); 

    ProcId = pe32.th32ProcessID; 
} 

Работает, но когда процесс «s.exe» не открыт, он захватывает свой собственный идентификатор процесса, я действительно не слишком уверен, как я может это исправить. помощь была бы очень признательна, спасибо!C++ Получить идентификатор процесса, получающий локальный идентификатор, если целевой процесс не открыт

+0

Пожалуйста, обратите внимание на ваш вопрос о том, четко. Также отредактируйте свой заголовок, чтобы отразить ваш вопрос. –

+0

Фактически он вытягивает идентификатор процесса последней информации процесса, полученной во время перечисления. Вы должны добавить чек, чтобы узнать, не найден ли процесс, который вы ищете. –

+0

Выглядит так, как будто вы всегда будете проверять последний pe32 и это может быть или не быть вызывающим процессом и может быть недействительным. Я ничего не вижу в документации, которая говорит, что вы получаете, когда 'Process32Next' возвращает false. – user4581301

ответ

0

Этот бит кода:

do{ 
     if(strcmp(pe32.szExeFile, "s.exe") == 0) 
      break; 
    }while(Process32Next(hSnapshot, &pe32)); 

будет перебирать все процессы, пока либо s.exe не найден или Process32Next возвращает ложь. В последнем случае состояние pe32, по-видимому, не определено. Вероятно, он останется неизменным и относится к последнему процессу в списке, но я не хочу вкладывать деньги в это.

Позже

ProcId = pe32.th32ProcessID; 

собирается использовать идентификатор процесса из pe32 является ли оно действительным или нет.

Я рекомендую следующую модификацию:

DWORD GetProcId() // now returns the process ID. Why mess around with globals? 
{ 
    PROCESSENTRY32 pe32; 
    HANDLE   hSnapshot = NULL; 
    DWORD pid = 0; // initialize to impossible pid 

    pe32.dwSize = sizeof(PROCESSENTRY32); 
    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    // should probably check for hSnapshot != INVALID_HANDLE_VALUE right about here 
    if(Process32First(hSnapshot, &pe32)) 
    { 
     do{ 
      if(strcmp(pe32.szExeFile, "s.exe") == 0) 
      { 
       pid = pe32.th32ProcessID; 
       break; 
      } 
     }while(Process32Next(hSnapshot, &pe32)); 
    } 

    if(hSnapshot != INVALID_HANDLE_VALUE) 
     CloseHandle(hSnapshot); 

    return pid; 
} 

Zero selected because you can't get a pid of zero in Windows.

Использование:

int main() 
{ 
    cout << GetProcId(); 
    return 0; 
} 
+0

теперь он просто возвращает 0, даже если процесс открыт. –

+0

Проверьте свой случай. Например, «S.exe» не будет соответствовать «s.exe». – user4581301

+0

футляр правильный –