C++ 启动一个进程,而不是作为子进程

C++ 启动一个进程,而不是作为子进程,c++,winapi,createprocess,C++,Winapi,Createprocess,我需要启动一个进程并将其作为分离的进程运行。我有一些入门应用程序,其目的是运行另一个exe并立即退出。实现这一目标的最佳方式是什么 我阅读了几次文档,但仍然有问题。文档说明我需要在完成后调用CloseHandle。但我的家长应用程序不应该等待孩子退出。文档的另一部分说我可以不处理句柄-当父进程终止时,系统将关闭它们。这是否意味着子应用程序在父应用程序之后立即退出?这似乎不是真的——我关闭了启动程序,但我的孩子进程仍然在运行 有一个分离的\u进程标志,它似乎就是我要找的。但文档说明了一些关于控制台

我需要启动一个进程并将其作为分离的进程运行。我有一些入门应用程序,其目的是运行另一个exe并立即退出。实现这一目标的最佳方式是什么

我阅读了几次文档,但仍然有问题。文档说明我需要在完成后调用
CloseHandle
。但我的家长应用程序不应该等待孩子退出。文档的另一部分说我可以不处理句柄-当父进程终止时,系统将关闭它们。这是否意味着子应用程序在父应用程序之后立即退出?这似乎不是真的——我关闭了启动程序,但我的孩子进程仍然在运行

有一个
分离的\u进程
标志,它似乎就是我要找的。但文档说明了一些关于控制台的内容。什么控制台?我不在乎控制台

我读了好几遍CreateProcess文档,但仍然有问题。文档说明我需要在完成后调用CloseHandle。但我的家长应用程序不应该等待孩子退出

好吧,那就别等了。您可以在父级中立即调用
CloseHandle

文档的另一部分说我可以不处理句柄-当父进程终止时,系统将关闭它们。这是否意味着子应用程序在父应用程序之后立即退出?这似乎不是真的——我关闭了启动程序,但我的孩子进程仍然在运行

不,没有。我不知道你是怎么从文件中得到的,但这不是它的意思

有一个分离的进程标志,这似乎是我要寻找的。但文档说明了一些关于控制台的内容。什么控制台?我不在乎控制台

如果你不在乎,那就别担心。

声明

对于控制台进程,新进程不会继承其父进程的控制台(默认)

这意味着:如果您有一个控制台进程,并且启动了一个新进程,它将不会继承其父控制台

如果您没有控制台进程,就不必担心它

创建子进程,但不会等待子进程完成,因此您已全部设置完毕

如果您想等待子进程完成,您应该调用
CreateProcess
,然后调用
WaitForSingleObject

总结如下:

// Version 1) Launch and wait for a child process completion
STARTUPINFO info = { sizeof(info) };
PROCESS_INFORMATION processInfo;
if (CreateProcess(L"C:\\myapp.exe", L"", NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo)) {
    ::WaitForSingleObject(processInfo.hProcess, INFINITE); // DO WAIT for the child to exit
    CloseHandle(processInfo.hProcess);
    CloseHandle(processInfo.hThread);
}

// ----------------------------------------------------------------

// Version 2) Launch and do NOT wait for a child process completion
STARTUPINFO info = { sizeof(info) };
PROCESS_INFORMATION processInfo;
if (CreateProcess(L"C:\\myapp.exe", L"", NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo)) {
    CloseHandle(processInfo.hProcess); // Cleanup since you don't need this
    CloseHandle(processInfo.hThread); // Cleanup since you don't need this
}

请注意,版本2不会终止您的子进程。只释放不再需要的资源。

对进程句柄调用
CloseHandle
不会终止进程。它只是关闭进程对象的句柄。进程对象仍然存在,并将继续运行。因此,请调用
CreateProcess
,然后终止启动程序进程。如果需要,请在两个句柄上调用
CloseHandle
。或者没有,系统会帮你整理。哦,我以为关闭一个手柄意味着关闭一个应用。。。若starter退出,但child将写入其控制台(假设我们没有指定标志),该怎么办?我将gui应用程序作为子应用程序使用,因此无法进行检查。@nikitablacka win32应用程序不会使用控制台子系统。在那种情况下也没有问题。