我使用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?最后用它来结束这个过程?
谢谢你。
4条答案
按热度按时间bmp9r5qi1#
在结构
pi
中,你得到:第一个参数是进程的句柄。
You can use that handle to end the process:
要终止的进程的句柄。
句柄必须具有PROCESS_TERMINATE访问权限。有关详细信息,请参阅进程安全性和访问权限。
进程和线程使用的退出代码因此调用而终止。使用GetExitCodeProcess函数检索进程的退出值。使用GetExitCodeThread函数检索线程的退出值。
qij5mzcb2#
进程的句柄在PROCESS_INFORMATION结构
pi
变量中返回。TerminateProcess()函数可用于终止进程。但是,您应该考虑为什么需要终止进程,以及为什么无法正常关闭。
注意,在调用
CreateProcess()
之前,需要设置si
的cb
成员:编辑:
要取消控制台窗口,请指定
CREATE_NO_WINDOW
作为CreateProcess()
调用中的creation flag(第六个参数)。编辑(2):
要抑制窗口,请在调用
CreateProcess()
之前尝试设置STARTUPINFO结构的以下成员:6yjfywim3#
干净地关闭进程
要干净地关闭进程,您应该首先发送一个关闭信号:
How To Terminate an Application "Cleanly" in Win32.
如果您必须关闭进程,请执行以下步骤:
1.向您要关闭的进程所拥有的所有顶级窗口发布WM_CLOSE。许多Windows应用程序通过关闭来响应此消息。
注意:控制台应用程序对WM_CLOSE的响应取决于它是否安装了控制处理程序。
使用EnumWindows()查找目标窗口的句柄。在回调函数中,检查Windows的进程ID是否与要关闭的进程匹配。您可以通过调用GetWindowThreadProcessId()来完成此操作。建立匹配后,使用PostMessage()或SendMessageTimeout()将WM_CLOSE消息发送到窗口。
1.使用WaitForSingleObject()等待进程的句柄。请确保使用超时值等待,因为在许多情况下WM_CLOSE不会关闭应用程序。请记住使超时时间足够长(使用WaitForSingleObject()或SendMessageTimeout()),以便用户可以响应为响应WM_CLOSE消息而创建的任何对话框。
1.如果返回值为WAIT_OBJECT_0,则应用程序会自动关闭。如果返回值是WAIT_TIMEOUT,那么必须使用TerminateProcess()关闭应用程序。
注意:如果从WaitForSingleObject()获取的返回值不是WAIT_OBJECT_0或WAIT_TIMEOUT,请使用GetLastError()确定原因。
通过遵循这些步骤,您可以为应用程序提供最佳的机会来彻底关闭(除了IPC或用户干预之外)。
See this answer for code.
终止进程
如果你不关心干净的关机,你可以使用
TerminateProcess()
。但是,需要注意的是,TerminateProcess()
是异步的;它启动终止并立即返回。如果必须确保进程已终止,请使用进程句柄调用WaitForSingleObject()
函数。注意:Access rights
PROCESS_TERMINATE
和SYNCHRONIZE
是必需的。不打烊,等着看完
如果进程将自行完成,您可以等待它完成,而不是终止。
7ivaypg94#
这在MSDN中有详细解释:
如果result非零(这意味着它成功了),您将在
pi
structure中获得句柄和processsid。为了终止进程,可以使用TerminateProcess