Как завершить процесс, созданный 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 этого конкретного процесса? И в конечном итоге использовать его, чтобы закрыть этот процесс?
Спасибо.
Ответы
Ответ 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