c++ 如何终止由CreateProcess()创建的进程?

k3fezbri  于 2023-05-20  发布在  其他
关注(0)|答案(4)|浏览(348)

我使用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?最后用它来结束这个过程?
谢谢你。

bmp9r5qi

bmp9r5qi1#

在结构pi中,你得到:

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

第一个参数是进程的句柄。
You can use that handle to end the process

BOOL WINAPI TerminateProcess(
    __in  HANDLE hProcess,
    __in  UINT uExitCode
);
  • hProcess [in]*

要终止的进程的句柄。
句柄必须具有PROCESS_TERMINATE访问权限。有关详细信息,请参阅进程安全性和访问权限。

  • uExitCode [in]*

进程和线程使用的退出代码因此调用而终止。使用GetExitCodeProcess函数检索进程的退出值。使用GetExitCodeThread函数检索线程的退出值。

qij5mzcb

qij5mzcb2#

进程的句柄在PROCESS_INFORMATION结构pi变量中返回。
TerminateProcess()函数可用于终止进程。但是,您应该考虑为什么需要终止进程,以及为什么无法正常关闭。
注意,在调用CreateProcess()之前,需要设置sicb成员:

si.cb = sizeof(STARTUPINFO);

编辑:
要取消控制台窗口,请指定CREATE_NO_WINDOW作为CreateProcess()调用中的creation flag(第六个参数)。
编辑(2):
要抑制窗口,请在调用CreateProcess()之前尝试设置STARTUPINFO结构的以下成员:

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

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 rightsPROCESS_TERMINATESYNCHRONIZE是必需的。

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);
7ivaypg9

7ivaypg94#

这在MSDN中有详细解释:
如果result非零(这意味着它成功了),您将在pi structure中获得句柄和processsid。
为了终止进程,可以使用TerminateProcess

相关问题