У меня есть консольное приложение VC++, и мне нужно проверить, работает ли другой процесс. У меня нет названия окна, у меня есть имя исполняемого файла. Как мне получить дескриптор процесса/PID? Можно ли перечислить процессы, запущенные с помощью этого .exe?Как посмотреть, работает ли другой процесс на окнах?
ответ
Вы можете использовать EnumProcesses для перечисления процессов в системе.
Вам нужно будет использовать OpenProcess для получения дескриптора процесса, затем QueryFullProcessImageName, чтобы получить исполняемые процессы.
Используйте 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 член может быть достаточно для ваших нужд.
Отлично. С исходным кодом тоже. Благодаря! –
Этот вопрос предназначен для VB, но вызовы API должны применяться и на C++: http://stackoverflow.com/questions/1143301/how-to-enumerate-processes-from-vb-6-on-win- 2003 – bdonlan