实现方法一、使用 _popen()和_pclose()方法
char buf[1024];
string strCmd="ping 192.168.1.1";
FILE *Pipe = NULL;
if ((Pipe = _popen(strCmd.c_str(), "r")) == NULL)
{
return "";
}
string strResult;
while (fgets(buf, sizeof(buf), pf))
{
strResult += buf;
}
_pclose(pf);
网上有人说这个会隐藏黑窗口。但是从百度上检索到一段说明:popen() 函数通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程。这个进程必须由 pclose() 函数关闭,而不是 fclose() 函数。pclose() 函数关闭标准 I/O 流,等待命令执行结束,然后返回 shell 的终止状态。如果 shell 不能被执行,则 pclose() 返回的终止状态与 shell 已执行 exit 一样。
而实际情况是会有黑窗口一闪而过。
实现方法二、WinExec()函数
UINT WinExec( LPCSTR lpCmdLine, UINT uCmdShow);
其第一个参数相当于system函数的参数,其第二个参数可以设置窗口是否显示,SW_HIDE这个宏表示隐藏窗口。
此方法可以设置不显示黑窗口,但是该方法创建一个进进程后会立刻返回,不会等待返回结果。因此对于需要返回信息或需要控制调用的进程时,可能该方法不是非常合适。

本文详细介绍了在Windows环境下实现进程间通信的三种方法:使用_popen()和_pclose()、WinExec()函数以及匿名管道与重定向。每种方法的特点、适用场景及代码示例均有涉及,特别强调了如何避免黑窗口的显示。
最低0.47元/天 解锁文章
1325

被折叠的 条评论
为什么被折叠?



