Подсчет общего количества одинаковых запущенных процессов в C++
Я ищу способ обнаружить # запущенных процессов с одинаковым именем процесса.
Например, я трижды запускал блокнот.
notepad.exe notepad.exe notepad.exe
Так что вернется 3.
В настоящее время у меня есть этот код для обнаружения запущенного процесса, но не считая количество запущенных процессов.
#include#include #include #include bool IsProcessRunning (const char * ProcessName); int main () { char * notepadRunning = (IsProcessRunning ("notepad.exe"))? "Да нет"; std::cout << "Блокнот работает? " << notepadRunning; вернуть 0; } bool IsProcessRunning (const char * ProcessName) { PROCESSENTRY32 pe32 = {sizeof (PROCESSENTRY32)}; HANDLE hSnapshot = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0); if (Process32First (hSnapshot, & pe32)) { делать { if(_tcsicmp(pe32.szExeFile, ProcessName) == 0) { CloseHandle(hSnapshot); вернуть истину; } } while (Process32Next (hSnapshot, & pe32)); } CloseHandle (hSnapshot); вернуть ложь; }
Любая помощь будет оценена:)
Благодарю.
2 ответа
Вы используете правильный API, а именно CreateToolhelp32Snapshot, Process32First и Process32Next. И, как вы делаете, вы должны использовать член szExeFile из структуры PROCESSENTRY32.
Вы вернетесь из своей функции, когда вы найдете соответствие в настоящее время, хотя. Вместо этого вы должны увеличивать счетчик и НЕ возвращаться. И вернуть int с числом процессов вместо bool. Также не делайте CloseHandle(hSnapshot); до конца функции после того, как у вас есть счет.
Также убедитесь, что сначала получите привилегию SeDebugPrivilege
перед перечислением вы получите все процессы для всех сеансов и пользователей.
Чтобы получить привилегию, чтобы получить все сеансы:
acquirePrivilegeByName(SE_DEBUG_NAME);// SeDebugPrivilege
Где acqurivilegeByName определяется как:
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()
У вас могут быть проблемы с правами доступа. В частности, в Vista я не думаю, что вы можете перечислить все процессы, если вы не запускаете с повышенными привилегиями.
Вы также можете попробовать использовать API EnumProcesses. Есть полный пример того, как перечислить все процессы.