(C++, Windows) 在没有控制台的情况下生成子进程 window(使用 CreateProcess)
(C++, Windows) Spawn child process without console window (using CreateProcess)
我花了一周的大部分时间来寻找这个(我认为)简单问题的答案,虽然我已经找到了很多其他的答案,但我还没有找到明确的答案,甚至任何我可以开始工作的东西。
我的问题是:如何调用子进程,并在不产生浮动控制台的情况下从其标准输出管道静默读取字符串、数组或其他内容?window?
到目前为止,我已经借用并稍微调整了这段代码:
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
是一个模板函数,我用它来传递各种东西并取回一个字符串
现在,这个函数 工作 完美,如果我们谈论的是功能与形式。它运行子进程,我得到一个字符串数组 - 一个用于子进程输出的每一行。但是,每次运行时,都会打开一个命令提示符 window。我知道使用 popen 无法避免这种情况,所以我转向了 CreateProcess()。但是,我还没有设法使用 CreateProcess 创建与上述函数等效的函数,而这正是我想要做的。
有人可以帮忙吗?将不胜感激,如果您成功的话,您将创建在互联网上任何地方执行此操作的权威指南:)
抱歉,我想我应该发布这样的答案。那么这里是:
通过添加额外的 2 行代码,我已经能够解决我的问题,同时继续使用我已经拥有的功能(使用 popen)。如果您绝对不需要弹出窗口,那么这对您来说不够好,但是如果您只能处理 1 个非常简短的弹出窗口,并且此后再也没有任何内容,那么这可能是您最好的答案,因为它比任何一个都短"solutions" 我见过使用 CreateProcess(与所有其他方法不同,这实际上是我第一次使用并且非常容易)。
将以下两行添加到图形程序的主要功能的顶部:
AllocConsole();
ShowWindow(GetConsoleWindow(), SW_HIDE);
第一个创建控制台 window 并将其与您的程序相关联。下一行立即隐藏它。这确实创建了一个弹出窗口(一个非常简短的弹出窗口),但由于现在有一个控制台 window 用于您的应用程序,因此对 popen 的所有调用都可以存在于其中,而不是创建自己的 window 每一次。
我花了一周的大部分时间来寻找这个(我认为)简单问题的答案,虽然我已经找到了很多其他的答案,但我还没有找到明确的答案,甚至任何我可以开始工作的东西。
我的问题是:如何调用子进程,并在不产生浮动控制台的情况下从其标准输出管道静默读取字符串、数组或其他内容?window?
到目前为止,我已经借用并稍微调整了这段代码:
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
是一个模板函数,我用它来传递各种东西并取回一个字符串
现在,这个函数 工作 完美,如果我们谈论的是功能与形式。它运行子进程,我得到一个字符串数组 - 一个用于子进程输出的每一行。但是,每次运行时,都会打开一个命令提示符 window。我知道使用 popen 无法避免这种情况,所以我转向了 CreateProcess()。但是,我还没有设法使用 CreateProcess 创建与上述函数等效的函数,而这正是我想要做的。
有人可以帮忙吗?将不胜感激,如果您成功的话,您将创建在互联网上任何地方执行此操作的权威指南:)
抱歉,我想我应该发布这样的答案。那么这里是:
通过添加额外的 2 行代码,我已经能够解决我的问题,同时继续使用我已经拥有的功能(使用 popen)。如果您绝对不需要弹出窗口,那么这对您来说不够好,但是如果您只能处理 1 个非常简短的弹出窗口,并且此后再也没有任何内容,那么这可能是您最好的答案,因为它比任何一个都短"solutions" 我见过使用 CreateProcess(与所有其他方法不同,这实际上是我第一次使用并且非常容易)。
将以下两行添加到图形程序的主要功能的顶部:
AllocConsole();
ShowWindow(GetConsoleWindow(), SW_HIDE);
第一个创建控制台 window 并将其与您的程序相关联。下一行立即隐藏它。这确实创建了一个弹出窗口(一个非常简短的弹出窗口),但由于现在有一个控制台 window 用于您的应用程序,因此对 popen 的所有调用都可以存在于其中,而不是创建自己的 window 每一次。