以调用外部应用(以CMD为例)时是否隐藏黑窗口为例初步了解重定向与匿名管道

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

实现方法一、使用 _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这个宏表示隐藏窗口。

此方法可以设置不显示黑窗口,但是该方法创建一个进进程后会立刻返回,不会等待返回结果。因此对于需要返回信息或需要控制调用的进程时,可能该方法不是非常合适。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值