不像孩子一样开始一个过程

nik*_*ack 5 c++ winapi createprocess

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

CreateProcess多次阅读文档,但仍然有疑问。文档说CloseHandle我完成后需要打电话。但是我的父母的应用程序不应该等待孩子退出。文档的另一部分说,我可以不理会句柄-当父进程终止时,系统将关闭它们。这是否意味着子应用程序在父项之后立即退出?似乎不正确-我关闭了启动器,但子进程仍然运行。

DETACHED_PROCESS似乎我在寻找一个标志。但是文档说明了一些有关控制台的内容。什么控制台?我不在乎控制台。

Mar*_* A. 5

DETACHED_PROCESS标志文档的状态

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

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

如果您没有控制台进程,则不必担心。

CreateProcess创建一个子进程,但不等待该子进程完成,因此您已经准备就绪。

如果要等待子进程完成,则应先调用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
}
Run Code Online (Sandbox Code Playgroud)

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