我使用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)
我如何获取该特定进程的句柄和进程ID?最终如何使用它来关闭该进程?
谢谢。
我使用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)
我如何获取该特定进程的句柄和进程ID?最终如何使用它来关闭该进程?
谢谢。
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函数检索线程的退出值。
在 PROCESS_INFORMATION 结构体中,变量 pi
返回了进程的句柄。
TerminateProcess() 函数可用于终止进程。但是,您应该考虑为什么需要终止进程以及为什么无法进行优雅的关闭。
注意,在调用 CreateProcess()
之前,您需要设置 si
的 cb
成员:
si.cb = sizeof(STARTUPINFO);
编辑:
为了抑制控制台窗口,请在CreateProcess()
调用中将创建标志(第六个参数)指定为CREATE_NO_WINDOW
。
编辑(2):
为了抑制窗口,请在调用CreateProcess()
之前设置以下STARTUPINFO结构的成员:
STARTUPINFO si = {0};
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = FALSE;
为了优雅地关闭进程,您应该首先发送一个关闭信号:
如果您绝对必须关闭一个进程,请按照以下步骤操作:如果您不关心干净的关闭,可以使用TerminateProcess()
。但是,请注意TerminateProcess()
是异步的;它启动终止并立即返回。如果您必须确保进程已终止,请使用指向该进程的句柄调用WaitForSingleObject()
函数。
注意:访问权限需要PROCESS_TERMINATE
和SYNCHRONIZE
。
TerminateProcess(pi.hProcess, 0);
// 500 ms timeout; use INFINITE for no timeout
const DWORD result = WaitForSingleObject(pi.hProcess, 500);
if (result == WAIT_OBJECT_0) {
// Success
}
else {
// Timed out or an error occurred
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
如果进程会自行完成,而不是强制终止,您可以等待其完成。
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
dbntsrv.exe
时,会打开哪个窗口?它是控制台窗口吗? - hmjd