通过匿名管道获取CMD运行结果
#include <iostream>
#include <string>
#include <Windows.h> using namespace std; /*
获取CMD执行结果
cmdLine:要执行的命令
*/
char *GetCmdRet(char *cmdLine); int main(void)
{
char *ret = GetCmdRet("ipconfig");
cout << ret << endl;
free(ret);
cout << "\n====================换个命令玩玩====================\n" << endl;
ret = GetCmdRet("dir");
cout << ret << endl;
free(ret);
system("pause");
return ;
} char *GetCmdRet(char *cmdLine)
{
HANDLE hRead = NULL, hWrite = NULL;
PROCESS_INFORMATION pInfo = { };
SECURITY_ATTRIBUTES se = { };
STARTUPINFO sInfo = { };
char tmpCmd[] = { }, *retStr = NULL;
DWORD dwLen = ;
string ret; se.nLength = sizeof(se);
se.lpSecurityDescriptor = NULL;
se.bInheritHandle = TRUE; // 创建一个匿名管道
CreatePipe(&hRead, &hWrite, &se, ); sInfo.cb = sizeof(sInfo);
sInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; // 这两个常量分别用于设置隐藏窗口+输出目标
sInfo.wShowWindow = SW_HIDE; // 隐藏窗口运行
sInfo.hStdOutput = hWrite; // 让其输出到这个管道去而不是输出到控制台
sInfo.hStdError = hWrite; // 错误信息也是输出到该管道
sprintf_s(tmpCmd, MAX_PATH, "cmd.exe /c %s", cmdLine);
CreateProcess(NULL, tmpCmd, NULL, NULL, TRUE, NULL, NULL, NULL, &sInfo, &pInfo);
CloseHandle(hWrite); while (dwLen != -)
{
// 查看管道中是否有数据
PeekNamedPipe(hRead, NULL, NULL, NULL, &dwLen, NULL);
if (dwLen)
{
memset(tmpCmd, , MAX_PATH);
// 读取管道数据
ReadFile(hRead, tmpCmd, dwLen, &dwLen, NULL);
ret += tmpCmd;
}
else
{
DWORD dwExit = ;
GetExitCodeProcess(pInfo.hProcess, &dwExit);
// 避免程序已经退出,但管道仍有数据的情况
if (dwExit != STILL_ACTIVE)
{
CloseHandle(hRead);
break;
}
}
// 一定要加个延时,否则可能有重复数据
Sleep();
}
retStr = (char *)malloc(sizeof(char)*ret.length() + );
memset(retStr, , ret.length() + );
lstrcpyn(retStr, ret.c_str(), ret.length() + );
return retStr;
}

通过匿名管道获取CMD运行结果的更多相关文章
- 匿名管道读取CMD回显信息
之前用了很坑爹的做法去读取了cmd命令的回显信息,现在发现了用匿名管道的实现方法,由于楼主没有学过Windows核心编程,找了一个代码来凑数 存下来以后研究 #include <windows. ...
- Qt 获取cmd运行结果
http://www.cnblogs.com/gisbeginner/archive/2012/12/08/2809063.html BOOL ExecDosCmd(){ #define EXECDO ...
- 匿名管道 远程cmd
管道是单向的,传送数据的方向是固定的,所以互相通信需要两个管道. STARTUPINFO si; ZeroMemory(&si,sizeof(si)); si.dwFlags = STARTF ...
- VC 模拟CMD 匿名管道
#include "stdafx.h" #include <Windows.h> #include <stdio.h> #include <stdli ...
- Windows下 C++ 实现匿名管道的读写操作
由于刚弄C++没多久,部分还不熟练,最近又由于开发需求要求实现与其他程序进行通信,瞬间就感觉想到了匿名通信.于是自己查阅了一下资料,实现了一个可读可写的匿名管道: 源代码大部分都有注释: Pipe.h ...
- Linux进程间通信-匿名管道
前面我们讲了进程间通信的一种方式,共享内存.下面看一看另一种机制,匿名管道.1.什么是管道管道是一个进程的数据流到另一个进程的通道,即一个进程的数据输出作为另一个进程的数据输入,管道起到了桥梁的作用. ...
- Windows进程通信之一看就懂的匿名管道通信
目录 进程通信之一看就懂的匿名管道通信 一丶匿名管道 1.1何为匿名管道 1.2创建匿名管道需要注意的事项 1.3 创建匿名管道需要的步骤 1.4代码例子 1.5代码运行截图 进程通信之一看就懂的匿名 ...
- C++ 进程和匿名管道使用学习
平台 Windows10 + VS2015 学习内容 进程的创建使用(CreateProcess方式) 父子进程间匿名管道通信 相关函数及参数介绍 CreatePipe函数:该的原型为 CreateP ...
- Linux进程间通信(三):匿名管道 popen()、pclose()、pipe()、close()、dup()、dup2()
在前面,介绍了一种进程间的通信方式:使用信号,我们创建通知事件,并通过它引起响应,但传递的信息只是一个信号值.这里将介绍另一种进程间通信的方式——匿名管道,通过它进程间可以交换更多有用的数据. 一.什 ...
随机推荐
- Arcgis flex 切片地图麻点
在arcgis server中发布地图切片完成后,有时候在访问地图的时候会出现很多麻点, 其实是你切片的时候没有注意到一些选项.... 默认的切片是PNG8,说到这可能就明白了吧,png8的色彩范围: ...
- matlab练习程序(Hilbert图像置乱)
正好刚写了Hibert生成曲线,不如再加一篇应用的程序. 关于Hilbert图像置乱,我在网上搜的应用领域主要集中在数字水印和图像加密上,而这两个领域我都没怎么接触过. 大部分的图像置乱都是如下图的置 ...
- Windows资源管理器对物理内存的描述
对每个进程的虚拟/物理内存使用描述: 1.硬错误/秒:在最后一分钟内每秒出现的平均硬页错误数 2.提交(KB):操作系统为内存保留的虚拟内存量,任务管理器中显示为:提交大小 3.工作集(KB):进程当 ...
- Redis安装及配置
Redis缓存数据库 借鉴出处 http://www.runoob.com/redis/redis-install.html http://www.runoob.com/redis/redis-con ...
- DataBase Migration 使用笔记
Add-Migration 新建数据库迁移版本 Update-Database -Verbose 更新到数据库(-Verbose 显示详细信息) Update-Database –TargetMigr ...
- 关于Java中截取字符串
获取系统时间:to_char(sysdate,'yyyy-mm-dd')截取CREATETIME常量的前10位字符串:CREATETIME.substring(0,10)截取DESCRIPT常量的前2 ...
- escape,unescape与encodeURIComponent,decodeURIComponent
escape:将string转成unicode字符串 escape('
- [原]Android打包之Ant打包
Android自动打包流程详细图: 使用Ant打包会简单很多,只要使用以下两个命令就可以搞定: android update project -p . --target android-18 ant ...
- Android(java)学习笔记31:泛型高级之通配符
1. 泛型高级之通配符: package cn.itcast_07; import java.util.ArrayList; import java.util.Collection; /* * 泛型高 ...
- Hive创建外部表以及分区
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/sheismylife/article/details/27874943 创建带分区的外部表 创建外部 ...