(c++, Windows)生成没有控制台窗口的子进程(使用CreateProcess)
(C++, Windows) Spawn child process without console window (using CreateProcess)
我花了一个星期的大部分时间来寻找这个(我认为)简单问题的答案,虽然我发现了许多其他问题的答案,但我还没有找到一个明确的答案,甚至没有找到任何我可以得到的答案。
我的问题是:我怎么能调用一个子进程,并从它的标准输出管道默默地读到一个字符串,数组,或在父进程的东西,而不产生一个浮动控制台窗口?
到目前为止,我已经借用并稍微调整了以下代码:wls EXEC(string comm) {
wls _internal;
FILE* pipe = popen(comm.c_str(), "r");
if (!pipe)
return _internal;
char buffer[8192];
while (!feof(pipe))
if (fgets(buffer, 8192, pipe) != NULL)
_internal.push_back(ATS(buffer).substr(0, ATS(buffer).size() - 1));
pclose(pipe);
return _internal;
}
重要背景信息:
wls
是typedef vector<string> wls;
ATS
是一个模板函数,我用它来传递各种各样的东西,并得到一个字符串
现在,这个函数可以很好地工作,如果我们讨论函数和形式。它运行子进程,我得到一个字符串数组——每一行对应子进程的输出。但是,每次运行它时,都会打开一个命令提示符窗口。我明白,没有办法避免这与popen,所以我已经转向CreateProcess()。然而,我没有设法使用CreateProcess创建一个与上面相同的函数,这就是我想要做的。
有谁能帮帮忙吗?我将不胜感激,如果你成功了,你将为互联网上的任何地方创建一个权威的指南:)对不起,我想我应该贴一个这样的答案。
通过添加2行额外的代码,我已经能够解决我的问题,同时继续使用我已经拥有的函数(与popen)。如果你绝对不需要弹出窗口,这对你来说还不够好,但是如果你能处理一个非常简短的弹出窗口,之后什么都没有,这可能是你最好的答案,因为它比我见过的使用CreateProcess的任何"解决方案"都要短得多(与所有这些不同,这实际上对我来说第一次很容易)。
将以下两行添加到图形化程序的main函数的顶部:
AllocConsole();
ShowWindow(GetConsoleWindow(), SW_HIDE);
第一个创建控制台窗口并将其与程序关联。下一行立即隐藏了它。这确实会创建一个弹出窗口(一个非常简短的窗口),但是由于现在有了应用程序的控制台窗口,所以对popen的任何和所有调用都可以存在于其中,而不是每次都创建自己的窗口。
- 终止 QProcess 不会终止子进程
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 子进程更新共享 mmap 内存,但父进程没有更改
- 使用 waitpid 时等待子进程终止
- 使用重定向标准处理子进程中的 kbhit
- 由 JOB 中的进程启动的子进程是否可以将 JOB 属性设置为脱离作业?
- 是否可以将子进程的 stdout 重定向到父进程中的另一个文件?
- kill() 总是返回 0(成功),即使在子进程已经结束之后?
- 父进程和子进程之间的 POSIX 信号量
- 检测到由于操作系统内存不足而导致子进程终止
- 使用system()创建独立的子进程
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 在 Bash 脚本中处理来自子进程的信号
- Qt C++ - 如何成功将数据传递给子进程?
- 通过 pid 窗口判断进程是否存在
- C++ 窗口本地系统模拟在子进程中失败
- 将类型化数组写入子进程 stdin 无法正常工作
- C++ Windows CreateChildProcess - 隐藏/不显示子进程的控制台窗口
- (c++, Windows)生成没有控制台窗口的子进程(使用CreateProcess)
- 如何使子进程具有与 parrent 相同的环境变量,并在窗口中拥有自己的环境变量?