通过匿名管道获取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()
在前面,介绍了一种进程间的通信方式:使用信号,我们创建通知事件,并通过它引起响应,但传递的信息只是一个信号值.这里将介绍另一种进程间通信的方式——匿名管道,通过它进程间可以交换更多有用的数据. 一.什 ...
随机推荐
- 运行jsp时,报错404
The origin server did not find a current reprsentation for the target resource or is not willing to ...
- WinSock 重叠IO模型
title: WinSock 重叠IO模型 tags: [WinSock 模型, 网络编程, 重叠IO模型] date: 2018-06-29 20:26:13 categories: Windows ...
- Ruby(或cmd中)输入命令行编译sass
Ruby(或cmd中)输入命令行编译sass步骤如下: 举例: 1.在F盘中新建一个总文件夹,比如test文件夹,其中在该文件夹下面建立html.images.js.sass等文件夹. 2.在sass ...
- OpenStack各组件详解和通信流程
一.openstack由来 openstack最早由美国国家航空航天局NASA研发的Nova和Rackspace研发的swift组成.后来以apache许可证授权,旨在为公共及私有云平台建设.open ...
- stark——增删改页面
一.制作添加页面 1.前置准备 (1)修改增删改的视图函数名 class ModelStark(object): def add_view(self, request): return HttpRes ...
- Linux漏洞分析入门笔记-Off-By-One(栈)
ubuntu-16.04.5(X86) IDA7.0 0x00.漏洞描述 1.什么是off by one?又称1字节溢出. 源字符串长度等于目标缓冲区长度时,将源字符串复制到目标缓冲区可能会导致off ...
- 【2015 Week Task】
2015 第17周 task:项目语音识别技术整理 2015 第18周 task:项目key技术整理
- 用Webstorm 运行React-native 工程时,出错:xcrun: error: unable to find utility "instruments", not a developer tool or in PATH
解决方法:在 终端执行如下命令 sudo xcode-select -s /Applications/Xcode.app/Contents/Developer/ 注意:前提是你已经安装了xcode
- QT隐含共享类 QSharedData QSharedDataPointer
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/davidsu33/article/details/28857391 QT中非常多类都实现了隐含共享比 ...
- 【LOJ2461】「2018 集训队互测 Day 1」完美的队列(分块+双指针)
点此看题面 大致题意: 让你维护\(n\)个有限定长度的队列,每次区间往队列里加数,求每次加完后的队列里剩余元素种类数. 核心思路 这道题可以用分块+双指针去搞. 考虑求出每个操作插入的元素在队列中被 ...