博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过匿名管道获取CMD运行结果
阅读量:6530 次
发布时间:2019-06-24

本文共 2334 字,大约阅读时间需要 7 分钟。

1 #include 
2 #include
3 #include
4 5 using namespace std; 6 7 /* 8 获取CMD执行结果 9 cmdLine:要执行的命令10 */11 char *GetCmdRet(char *cmdLine);12 13 int main(void)14 {15 char *ret = GetCmdRet("ipconfig");16 cout << ret << endl;17 free(ret);18 cout << "\n====================换个命令玩玩====================\n" << endl;19 ret = GetCmdRet("dir");20 cout << ret << endl;21 free(ret);22 system("pause");23 return 0;24 }25 26 char *GetCmdRet(char *cmdLine)27 {28 HANDLE hRead = NULL, hWrite = NULL;29 PROCESS_INFORMATION pInfo = { 0 };30 SECURITY_ATTRIBUTES se = { 0 };31 STARTUPINFO sInfo = { 0 };32 char tmpCmd[1000000] = { 0 }, *retStr = NULL;33 DWORD dwLen = 0;34 string ret;35 36 se.nLength = sizeof(se);37 se.lpSecurityDescriptor = NULL;38 se.bInheritHandle = TRUE;39 40 // 创建一个匿名管道41 CreatePipe(&hRead, &hWrite, &se, 0);42 43 sInfo.cb = sizeof(sInfo);44 sInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; // 这两个常量分别用于设置隐藏窗口+输出目标45 sInfo.wShowWindow = SW_HIDE; // 隐藏窗口运行46 sInfo.hStdOutput = hWrite; // 让其输出到这个管道去而不是输出到控制台47 sInfo.hStdError = hWrite; // 错误信息也是输出到该管道48 sprintf_s(tmpCmd, MAX_PATH, "cmd.exe /c %s", cmdLine);49 CreateProcess(NULL, tmpCmd, NULL, NULL, TRUE, NULL, NULL, NULL, &sInfo, &pInfo);50 CloseHandle(hWrite);51 52 while (dwLen != -1)53 {54 // 查看管道中是否有数据55 PeekNamedPipe(hRead, NULL, NULL, NULL, &dwLen, NULL);56 if (dwLen)57 {58 memset(tmpCmd, 0, MAX_PATH);59 // 读取管道数据60 ReadFile(hRead, tmpCmd, dwLen, &dwLen, NULL);61 ret += tmpCmd;62 }63 else64 {65 DWORD dwExit = 0;66 GetExitCodeProcess(pInfo.hProcess, &dwExit);67 // 避免程序已经退出,但管道仍有数据的情况68 if (dwExit != STILL_ACTIVE)69 {70 CloseHandle(hRead);71 break;72 }73 }74 // 一定要加个延时,否则可能有重复数据75 Sleep(1);76 }77 retStr = (char *)malloc(sizeof(char)*ret.length() + 1);78 memset(retStr, 0, ret.length() + 1);79 lstrcpyn(retStr, ret.c_str(), ret.length() + 1);80 return retStr;81 }

 

 

 

 

 

转载于:https://www.cnblogs.com/biaoge140/p/9539218.html

你可能感兴趣的文章
DLL,DML,DCL,TCL in Oracle
查看>>
SSE指令集学习:Compiler Intrinsic
查看>>
两种attach to process的方法
查看>>
WCF如何使用X509证书(安装和错误)(二)
查看>>
Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
查看>>
iOS中--NSArray调用方法详解 (李洪强)
查看>>
java异步操作实例
查看>>
Centos6.8防火墙配置
查看>>
JAVA多线程的问题以及处理【转】
查看>>
【Java面试题】10 abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?...
查看>>
如何新建UML2项目?详细操作步骤介绍
查看>>
[精讲17] 组策略
查看>>
控制流
查看>>
interlij的快捷键
查看>>
如何在Rancher上运行Elasticsearch
查看>>
shell 找出数组元素中的最大值
查看>>
Vmware虚拟机linux系统混合模式上网
查看>>
MySQL在导入的时候遇到的错误
查看>>
LINUX 常用命令整理
查看>>
iOS 位枚举
查看>>