Функция C++ TerminateProcess

Я искал примеры функции Win32 API C++ TerminateProcess. (), но ничего не нашел.

Я не так хорошо знаком с Win32 API в целом, поэтому я хотел спросить, может ли кто-нибудь, кто разбирается в этом лучше меня, показать мне пример для,

  • Получение дескриптора процесса по его PID требуется для его завершения и последующего вызова с ним TerminateProcess.

Если вы не знакомы с C++, вам также поможет эквивалент C#.


person jemper    schedule 14.03.2010    source источник
comment
Вы просто ищете эту функцию WINAPI? .com/en-us/library/ms684320%28VS.85%29.aspx ? Собрать это вместе с TerminateProcess не должно быть слишком сложно.   -  person CB Bailey    schedule 15.03.2010
comment
Нет, я хочу завершить запущенный процесс. Вот почему я упомянул, что сначала мне нужно получить PID.   -  person jemper    schedule 15.03.2010
comment
Когда кто-то даст вам ссылку, прочтите ее. Не просто предполагайте из названия, что он делает. На самом деле OpenProcess создает дескриптор процесса с заданным PID, а это именно то, что вы просили. @Charles: Это должен быть ответ, а не комментарий.   -  person Ben Voigt    schedule 15.03.2010
comment
@Ben Voigt: Очевидно, это не весь ответ, поскольку последний комментарий предполагает, что нам нужно откуда-то получить PID. @jemper: Какой процесс вы хотите завершить? Как вы его идентифицируете, если не по PID?   -  person CB Bailey    schedule 15.03.2010
comment
Поскольку вы хотите завершить процесс, который вы не запускали, первое, что я хотел бы попросить дать вам ответ, это то, как вы планируете локализовать этот процесс. Вы ищете данный исполняемый файл, или вы покажете процессы и спросите пользователя, или это процесс, который открыл данный файл и т. д.? А что, если шаблону соответствует несколько процессов?   -  person Fabio Ceconello    schedule 15.03.2010


Ответы (1)


Чтобы ответить на исходный вопрос, чтобы получить дескриптор процесса по его PID и вызвать TerminateProcess, вам нужен код, подобный следующему:

BOOL TerminateProcessEx(DWORD dwProcessId, UINT uExitCode)
{
    DWORD dwDesiredAccess = PROCESS_TERMINATE;
    BOOL  bInheritHandle  = FALSE;
    HANDLE hProcess = OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
    if (hProcess == NULL)
        return FALSE;

    BOOL result = TerminateProcess(hProcess, uExitCode);

    CloseHandle(hProcess);

    return result;
}

Имейте в виду, что TerminateProcess не позволяет своей цели очиститься и выйти в допустимом состоянии. Подумайте дважды, прежде чем использовать его.

person Don Reba    schedule 15.03.2010
comment
Как я могу получить PID процесса? - person BlackBear; 07.06.2011
comment
Какой у вас идентификатор процесса, для которого вы хотите получить PID? - person Don Reba; 08.06.2011
comment
Это не должно быть уникальным. У вас может быть несколько экземпляров исполняемого файла, работающих одновременно. Вы можете использовать EnumProcesses, чтобы получить все экземпляры процесса с заданным именем или применить некоторые дополнительные критерии выбора. - person Don Reba; 08.06.2011
comment
Остерегайтесь, что это вернется немедленно. Во время умирания процесс может еще какое-то время удерживать некоторые блокировки. Возможно, вам придется добавить цикл с GetExitCodeProcess, чтобы убедиться, что процесс уже умер. - person Vadzim; 16.05.2018