gpt4 book ai didi

winapi - CreateProcess 不会在 Windows 7 下创建额外的控制台窗口?

转载 作者:行者123 更新时间:2023-12-03 15:14:43 27 4
gpt4 key购买 nike

我正在尝试使用 CreateProcess(...) 运行一个进程并在单独的控制台窗口中独立运行它。

我可以使用 system("...") 函数来实现这一点,但我更喜欢 CreateProcess,因为它让我可以指定环境和工作目录,获取进程的句柄,以及在需要时通过管道传输 stdin/out到。

我在互联网上找到的只是逆问题,即人们拥有额外的控制台窗口并想要摆脱它们!在早期版本的 Windows 中,打开并显示新的控制台窗口似乎是正常行为?

现在,即使我运行“cmd.exe/c ...”,我也无法获得额外的窗口

我尝试使用 STARTF_USESHOWWINDOW 标志,但没有成功。

有人遇到过这个问题吗?

PS .:显示GUI窗口,例如。 notepad.exe 会正常出现。

这是我的代码(本质上)

PROCESS_INFORMATION processInfo;
STARTUPINFOA startupInfo;
ZeroMemory(&startupInfo,sizeof(startupInfo));
startupInfo.dwFlags |= CREATE_NEW_CONSOLE;
startupInfo.dwFlags |= DETACHED_PROCESS;
ok&=CreateProcessA( NULL,
const_cast<char*>(comand.c_str()), // safe for CreateProcessA
NULL, NULL, TRUE, NULL, NULL, NULL,
&startupInfo, &processInfo);

我正在尝试运行 C:/Windows/system32/cmd.exe/c help
程序运行,我可以从管道读取输出。还是没有 window 。

最佳答案

在使用 Win32 API 时,MSDN 确实是您最好的 friend 。现在,您的相关创建标志如下:
(no flags set) — 子进程(以 CreateProcess() 开头的进程)将与父进程(调用 CreateProcess() 的进程)共享控制台。
CREATE_NEW_CONSOLE — 子进程将收到一个新控制台,在新窗口中打开。正如 MSDN 明确指出的那样,此标志不得与 一起使用DETACHED_PROCESS ! 这正是您要使用的标志。
CREATE_NO_WINDOW — 子进程将收到一个新的控制台,但没有任何窗口。这是一个非常令人惊讶的标志,所以我将再次重申:子进程将有一个控制台,您可以在其中写入输出,您可以尝试从中读取输入等;这个控制台不同于父进程的控制台;这个控制台是不可见的,它没有可见的窗口,但它存在。例如,它对于在后台静默运行子进程很有用。请注意,此标志在与 CREATE_NEW_CONSOLE 一起使用时无效。或 DETACHED_PROCESS ——那些标志覆盖了这个。还要记住,当你启动一个 GUI 应用程序时,这个标志会被忽略:它不会收到一个不可见的控制台。
DETACHED_PROCESS — 子进程将不会收到任何控制台。 不得将此标志与 一起使用。 CREATE_NEW_CONSOLE .

现在更多关于正确调用 CreateProcess() .首先,你应该使用 CreateProcessW() .我特别厌倦了无法访问名为 日本語αβηλ 的目录中的文件的应用程序。 .

其次,即使使用ANSI版本,也要指定CREATE_UNICODE_ENVIRONMENT如果通过 NULL 则标记为环境。如果你不这样做,PATH最终可能会在子进程中被破坏,并且这个错误非常烦人。

三、不要const_cast<char*>command.c_str() .只需调用strdup()/wcsdup()就可以了,然后free()CreateProcess() 之后调用返回。或者如果你真的坚持要修改command到位,通过&command[0]作为参数。

四、别忘了设置你的STARTUPINFO的大小结构:startupInfo.cb = sizeof(startupInfo) .现代 Windows(至少是 XP 和 7)实际上允许您将此字段保留为零而不会产生任何有害后果,但依赖它有点草率的编程。

哦,虽然我们在这里:你提到你使用 CreateProcess()因为除其他外,它允许您明确地为 child 指定环境。好吧,关于 lpEnvironment 有一个小问题。记录在案的参数,但很容易被忽略。当您指定 NULL ,子继承父环境。当您指定非 NULL , parent 的环境没有添加到它。如果要添加到父环境,则必须使用 GetEnvironmentStrings()获取它,然后显式调整它。

关于winapi - CreateProcess 不会在 Windows 7 下创建额外的控制台窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14958276/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com