#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运行结果的更多相关文章

  1. 匿名管道读取CMD回显信息

    之前用了很坑爹的做法去读取了cmd命令的回显信息,现在发现了用匿名管道的实现方法,由于楼主没有学过Windows核心编程,找了一个代码来凑数 存下来以后研究 #include <windows. ...

  2. Qt 获取cmd运行结果

    http://www.cnblogs.com/gisbeginner/archive/2012/12/08/2809063.html BOOL ExecDosCmd(){ #define EXECDO ...

  3. 匿名管道 远程cmd

    管道是单向的,传送数据的方向是固定的,所以互相通信需要两个管道. STARTUPINFO si; ZeroMemory(&si,sizeof(si)); si.dwFlags = STARTF ...

  4. VC 模拟CMD 匿名管道

    #include "stdafx.h" #include <Windows.h> #include <stdio.h> #include <stdli ...

  5. Windows下 C++ 实现匿名管道的读写操作

    由于刚弄C++没多久,部分还不熟练,最近又由于开发需求要求实现与其他程序进行通信,瞬间就感觉想到了匿名通信.于是自己查阅了一下资料,实现了一个可读可写的匿名管道: 源代码大部分都有注释: Pipe.h ...

  6. Linux进程间通信-匿名管道

    前面我们讲了进程间通信的一种方式,共享内存.下面看一看另一种机制,匿名管道.1.什么是管道管道是一个进程的数据流到另一个进程的通道,即一个进程的数据输出作为另一个进程的数据输入,管道起到了桥梁的作用. ...

  7. Windows进程通信之一看就懂的匿名管道通信

    目录 进程通信之一看就懂的匿名管道通信 一丶匿名管道 1.1何为匿名管道 1.2创建匿名管道需要注意的事项 1.3 创建匿名管道需要的步骤 1.4代码例子 1.5代码运行截图 进程通信之一看就懂的匿名 ...

  8. C++ 进程和匿名管道使用学习

    平台 Windows10 + VS2015 学习内容 进程的创建使用(CreateProcess方式) 父子进程间匿名管道通信 相关函数及参数介绍 CreatePipe函数:该的原型为 CreateP ...

  9. Linux进程间通信(三):匿名管道 popen()、pclose()、pipe()、close()、dup()、dup2()

    在前面,介绍了一种进程间的通信方式:使用信号,我们创建通知事件,并通过它引起响应,但传递的信息只是一个信号值.这里将介绍另一种进程间通信的方式——匿名管道,通过它进程间可以交换更多有用的数据. 一.什 ...

随机推荐

  1. 【学习笔记】使用SQLyog连接MySQL数据库

    一.使用SQLyog创建数据库用来管理学生信息 #创建数据库student DROP DATABASE IF EXISTS Myschool; CREATE DATABASE Myschool; #在 ...

  2. 【学习笔记】String进阶:StringBuffer类(线程安全)和StringBuilder类

    一.除了使用String类存储字符串之外,还可以使用StringBuffer类存储字符串.而且它是比String类更高效的存储字符串的一种引用数据类型. 优点: 对字符串进行连接操作时,使用Strin ...

  3. Android UI 切图命名规范、标注规范及单位描述(转载)

    本文转自:https://blog.csdn.net/klxh2009/article/details/74938009 很多UI设计师做APP切图都会有两套,一套是Android的,一套是IOS的. ...

  4. matlab练习程序(矩形变换为圆)

    最近对图像坐标的变换很感兴趣啊,这次是将一张图像变换为圆形. 变换原理就是按变换前后像素到圆心的距离按比例缩减就行了. 改变x,y方向上的系数,应该还可以变换为椭圆,不过我还没有尝试. 注意我这里相当 ...

  5. 使用Unicode写文本文件:一个简单类的示例

    参考了http://forums.codeguru.com/showthread.php?457106-Unicode-text-file示例. class WOFSTREAM : public st ...

  6. 两种计算Java对象大小的方法

    之前想研究一下unsafe类,碰巧在网上看到了这篇文章,觉得写得很好,就转载过来.原文出处是: http://blog.csdn.net/iter_zc/article/details/4182271 ...

  7. Flask入门文件上传flask-uploads(八)

    1 视图传递多个参数 (1) 普通传参 : 关键字参数传递 return render_template('模板名称.html',arg1=val1,arg2=val2...) (2) 字典传参 : ...

  8. GitLab 数据备份和恢复

    GitLab 备份 /opt/gitlab/bin/gitlab-rake gitlab:backup:create //只是备份各项目的数据 完成后会在默认路径下多出来备份的tar包! /var/o ...

  9. 战神CPU计算机硬件组装

    今天本来更新DP常见优化的,但是下午土木学院吴书记找我组装电脑,晚上A题后,临时有一些事情,没来得及整理. 这里分享一下战神CPU(死垃圾)的组装. 一顿操作猛如虎,很艰难的装好机子了,发现吴书记被坑 ...

  10. intellij 无法导入 SimpleTagSupport问题

    主要原因还是导包问题: 需要导入2个包: 之前,我只导入 servlet-api.jar ,总是报错,最后导入jsp-api.jar后,才成功可以继承!