Как узнать, запущен ли другой процесс в Windows? - PullRequest
4 голосов
/ 29 июля 2009

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

Ответы [ 2 ]

4 голосов
/ 29 июля 2009

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

hSnapShot = FCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

Далее следуют Process32First и Process32Next .

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

PROCESSENTRY32W    processInfo;
processInfo.szExeFile

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

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

acquirePrivilegeByName(SE_DEBUG_NAME);// SeDebugPrivilege

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

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 может быть достаточно для ваших нужд.

2 голосов
/ 29 июля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...