如何为新的 cmd.exe 进程创建一个全新的控制台 window?

How can I create a whole new console window for a new cmd.exe process?

我正在 Windows 10 控制台中创建游戏引擎。现在的目标是模拟帧。除了一个例外,一切都很好——在我深入了解框架机器实现之前,我需要一种在程序之外显示日志的方法。所以我想在一个新的 window 中有一个新的控制台进程,只是为了在我的调试编译中做一些日志记录。

我找到了 CreateProcess() 函数,但是它的文档似乎不完整。

我填写的调用如下:

STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory(&si, sizeof si);
si.cb = sizeof si;
ZeroMemory(&pi, sizeof pi);

LPCWSTR appName { L"C:\WINDOWS\system32\cmd.exe" };
//LPCWSTR appName { L"C:\WINDOWS\system32\notepad.exe" };

CreateProcess (
    appName,        
    NULL,           
    NULL,           
    NULL,           
    FALSE,          
    0,              
    NULL,           
    NULL,           
    &si,            
    &pi         
)

我观察到指向记事本的 appName 变量按预期创建了一个新的 window,但是当指向 cmd 时,它会在同一个控制台中创建一个进程 window.

如何从控制台程序在新 window 中创建控制台进程?

我也对其他记录器实现想法持开放态度。

您可以在 CreateProcess()dwCreationFlags 参数中使用 CREATE_NEW_CONSOLEDETACHED_PROCESS 标志。见 Process Creation Flags:

Constant/value Description
CREATE_NEW_CONSOLE 0x00000010 The new process has a new console, instead of inheriting its parent's console (the default). For more information, see Creation of a Console. This flag cannot be used with DETACHED_PROCESS.
DETACHED_PROCESS 0x00000008 For console processes, the new process does not inherit its parent's console (the default). The new process can call the AllocConsole function at a later time to create a console. For more information, see Creation of a Console. This value cannot be used with CREATE_NEW_CONSOLE.

但是,为什么要使用单独的进程进行日志记录?只需让您的主控制台进程使用 CreateWindow/Ex(), and then it can display your log messages as needed, such as with a multi-line EDIT control, or a LISTVIEW control in report mode, etc. Then there will be no need to deal with inter-process communications 创建一个单独的 GUI window,跨进程边界编组您的日志数据。

或者(既然你问了 just to do some logging),只需写入日志文件并使用类似 tail 的实用程序实时显示它。

另一种选择:使用 OutputDebugString() and the DebugView 工具。