2009-07-29 3 views
4

У меня есть консольное приложение VC++, и мне нужно проверить, работает ли другой процесс. У меня нет названия окна, у меня есть имя исполняемого файла. Как мне получить дескриптор процесса/PID? Можно ли перечислить процессы, запущенные с помощью этого .exe?Как посмотреть, работает ли другой процесс на окнах?

+0

Этот вопрос предназначен для VB, но вызовы API должны применяться и на C++: http://stackoverflow.com/questions/1143301/how-to-enumerate-processes-from-vb-6-on-win- 2003 – bdonlan

ответ

2

Вы можете использовать EnumProcesses для перечисления процессов в системе.

Вам нужно будет использовать OpenProcess для получения дескриптора процесса, затем QueryFullProcessImageName, чтобы получить исполняемые процессы.

4

Используйте CreateToolhelp32Snapshot функции

hSnapShot = FCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 

с последующим Process32First и Process32Next.

Вы получите структуру PROCESSENTRY32 следующим образом с членом szExeFile.

PROCESSENTRY32W processInfo; 
processInfo.szExeFile 

Убедитесь, что сначала получить привилегию SeDebugPrivilege перед тем перечисляя, таким образом, вы получите все процессы во всех сессий и пользователей.

Чтобы получить привилегию, так что вы получите все сеансы:

acquirePrivilegeByName(SE_DEBUG_NAME);// SeDebugPrivilege 

Где acquirePrivilegeByName определяется как:

BOOL acquirePrivilegeByName(
          const TCHAR  *szPrivilegeName) 
{ 
    HANDLE   htoken; 
    TOKEN_PRIVILEGES tkp; 
    DWORD   dwerr; 

    //---------------- adjust process token privileges to grant privilege 
    if (szPrivilegeName == NULL) 
    { 
     SetLastError(ERROR_INVALID_PARAMETER); 
     return FALSE; 
    } 

    if (!LookupPrivilegeValue(NULL, szPrivilegeName, &(tkp.Privileges[0].Luid))) 
     return FALSE; 

    tkp.PrivilegeCount = 1; 
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &htoken)) 
     return FALSE; 

    if (!AdjustTokenPrivileges(htoken, FALSE, &tkp, 0, NULL, NULL) || 
     GetLastError() != ERROR_SUCCESS) // may equal ERROR_NOT_ALL_ASSIGNED 
    { 
     dwerr = GetLastError(); 
     CloseHandle(htoken); 
     SetLastError(dwerr); 
     return FALSE; 
    } 

    CloseHandle(htoken); 
    SetLastError(ERROR_SUCCESS); 

    return TRUE; 
} //acquirePrivilegeByName() 

Если вам нужно полное имя образа процесса вы можете использовать QueryFullProcessImageName, но szExeFile член может быть достаточно для ваших нужд.

+0

Отлично. С исходным кодом тоже. Благодаря! –