Подтвердить что ты не робот

Как завершить процесс, созданный CreateProcess()?

Я создал процесс, используя CreateProcess(). Это код:

STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
result = CreateProcess("C:\\AP\\DatabaseBase\\dbntsrv.exe", NULL, NULL, NULL, FALSE, 0, NULL, "C:\\ADP\\SQLBase", &si, &pi)

Как я могу получить Handle и processId этого конкретного процесса? И в конечном итоге использовать его, чтобы закрыть этот процесс?
Спасибо.

4b9b3361

Ответ 1

В структуре pi вы получите:

typedef struct _PROCESS_INFORMATION {
    HANDLE hProcess;
    HANDLE hThread;
    DWORD  dwProcessId;
    DWORD  dwThreadId;
} PROCESS_INFORMATION, *LPPROCESS_INFORMATION;

Первым параметром является дескриптор процесса.

Вы можете использовать этот дескриптор для завершения процесса:

BOOL WINAPI TerminateProcess(
    __in  HANDLE hProcess,
    __in  UINT uExitCode
);

hProcess [in]
Дескриптор процесса, который должен быть завершен.

У дескриптора должно быть право доступа PROCESS_TERMINATE. Дополнительные сведения см. В разделе "Безопасность процессов и права доступа".

uExitCode [in]
Код выхода, который будет использоваться процессом и потоками, прекращается в результате этого вызова. Используйте функцию GetExitCodeProcess для получения значения выхода процесса. Используйте функцию GetExitCodeThread для получения значения выхода потока.

Ответ 2

Обработчик процесса возвращается в структуре PROCESS_INFORMATION, переменной pi.

Функция TerminateProcess() может использоваться для завершения процесса. Однако вы должны подумать, почему вам нужно убить процесс и почему изящное завершение работы невозможно.

Обратите внимание, что перед вызовом CreateProcess() необходимо установить член cb si:

si.cb = sizeof(STARTUPINFO);

EDIT:

Чтобы отключить консольное окно, укажите CREATE_NO_WINDOW, как флаг создания (шестой аргумент) в вызове CreateProcess().

ИЗМЕНИТЬ (2):

Чтобы подавить окно, попробуйте установить следующие элементы структуры STARTUPINFO до вызова CreateProcess():

STARTUPINFO si = {0};
si.cb          = sizeof(STARTUPINFO);
si.dwFlags     = STARTF_USESHOWWINDOW;
si.wShowWindow = FALSE;

Ответ 3

STARTUPINFOA siStartupInfo;
PROCESS_INFORMATION piProcessInfo;
memset(&siStartupInfo, 0, sizeof(siStartupInfo));
memset(&piProcessInfo, 0, sizeof(piProcessInfo));
siStartupInfo.cb = sizeof(siStartupInfo);

DWORD dwExitCode = 0;
if (CreateProcess(prgName.c_str(),
                (LPSTR) parameters.c_str(), 
                0, 
                0, 
                false,
                CREATE_DEFAULT_ERROR_MODE, 
                0, 
                0,
                &siStartupInfo, 
                &piProcessInfo) != false)
{       
    dwExitCode = WaitForSingleObject(piProcessInfo.hProcess, (time_in_ms));
}
else
{        
    return GetLastError(); //return error or do smething else
}

CloseHandle(piProcessInfo.hProcess);
CloseHandle(piProcessInfo.hThread);

piProcessInfo.hProcess является дескриптором процесса.

WaitForSingleObject: ожидает, пока указанный объект не окажется в сигнальном состоянии, или истечет интервал времени ожидания.

После этого (time_in_ms) процесс будет закрыт.

Ответ 4

Это подробно объясняется в MSDN:

Если результат отличен от нуля (это означает, что он преуспел), вы получите дескриптор и processid в структуре pi.

Чтобы убить процесс, вы можете использовать TerminateProcess