我正在使用這段代碼從GUI應用程序啓動進程。但根據此代碼的說明,無法從控制檯應用程序啓動進程。其實我想這樣做,我想要一個控制檯應用程序啓動另一個控制檯進程,請你有任何想法如何做到這一點?從控制檯應用程序啓動控制檯應用程序
// This technique must be used for "console-less" parents such as GUI
// applications or detached applications.
// Using the STARTUPINFO STARTF_USESTDHANDLES flag, requires that
// the CreateProcess fInheritHandles parameter be set TRUE so that
// the file handles specified in the STARTUPINFO structure will be
// inherited by the child.
// setup the child process's handles for stdin, stdout, & stderr.
STARTUPINFO childProcStartupInfo;
memset(&childProcStartupInfo, 0, sizeof(childProcStartupInfo));
childProcStartupInfo.cb = sizeof(childProcStartupInfo);
childProcStartupInfo.hStdInput = hFromParent; // stdin
childProcStartupInfo.hStdOutput = hToParent; // stdout
childProcStartupInfo.hStdError = hToParentDup; // stderr
childProcStartupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
childProcStartupInfo.wShowWindow = SW_HIDE;
// Now create the child process, inheriting handles
PROCESS_INFORMATION childProcInfo; /* for CreateProcess call */
bOk = CreateProcess(
NULL, // filename
pCmdLine, // full command line for child
NULL, // process security descriptor */
NULL, // thread security descriptor */
TRUE, // inherit handles? Also use if STARTF_USESTDHANDLES */
0, // creation flags */
NULL, // inherited environment address */
NULL, // startup dir; NULL = start in current */
&childProcStartupInfo, // pointer to startup info (input) */
&childProcInfo); // pointer to process info (output) */
創建從一個控制檯應用程序(或任何其他應用程序)一個子進程是微不足道的。這樣做同時繼承stdout,stdin和stderr重定向的句柄完全是另一個問題,並且似乎是此代碼的要點(和錯誤)。你可能想先閱讀。 – WhozCraig
嗨克雷格,謝謝你的回覆,但你有一段代碼如何調用從控制檯應用程序啓動子進程?謝謝! – user1681210
*您*有一段代碼啓動子進程。你*沒有*是一段代碼,它以你想要的方式設置句柄繼承。爲此,我將你轉到我的事先評論。 – WhozCraig