如何为新的 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_CONSOLE
或 DETACHED_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 工具。
我正在 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_CONSOLE
或 DETACHED_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 工具。