(C ++,Windows)没有控制台窗口的Spawn子进程(使用CreateProcess)

时间:2015-09-11 22:15:38

标签: c++ pipe popen createprocess

我花了一个星期的大部分时间寻找答案(我认为)这个简单的问题,虽然我找到了很多其他人,但我还没有找到明确的答案,甚至我找不到任何答案可以开始工作。

我的问题是:如何调用子进程,并从其stdout管道静默读取到父进程中的字符串,数组或某些内容,而不会生成浮动控制台窗口?

到目前为止,我已经借用了这些代码并略微调整了一下:

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;
}

重要背景信息:

wlstypedef vector<string> wls;

的结果

ATS是一个模板函数,用于传递所有类型的东西并返回一个字符串

现在,如果我们谈论功能与形式,这个功能完美地工作。它运行子进程,然后返回一个字符串数组 - 一个用于子进程输出的每一行。但是,每次运行时,都会打开命令提示符窗口。我明白用popen没有办法避免这种情况,所以我转向了CreateProcess()。然而,我没有设法使用CreateProcess创建一个与上面的函数等效的函数,这就是我想要做的。

有人可以伸出援助之手吗?非常感谢,如果您成功,您将在互联网上的任何地方创建明确的指南:)

1 个答案:

答案 0 :(得分:0)

抱歉,我想我应该发布这样的答案。那么这就是:

只需添加2行代码,我就可以在继续使用我已经拥有的功能(使用popen)的同时解决我的问题。如果你完全不需要弹出窗口,这对你来说不够好,但如果你只能处理一个令人难以置信的简短弹出窗口,并且之后再也没有,那么这可能是你最好的答案,因为它可能是你的最佳答案。比任何&#34;解决方案短得多#34;我已经看到使用CreateProcess(并且与所有这些不同,这对我来说第一次非常容易)。

将以下2行添加到图形程序主函数的顶部:

AllocConsole();
ShowWindow(GetConsoleWindow(), SW_HIDE);

第一个创建控制台窗口并将其与您的程序相关联。下一行立即隐藏它。这确实创建了一个弹出窗口(非常简短),但由于现在有一个适用于您的应用程序的控制台窗口,所以对popen的任何和所有调用都可以存在于其中,而不是每次都创建自己的窗口。