VC获取DOS命令返回值

改变DOS程序的标准输出,用一个管道的写端口替换他,然后windows程序从管道的读端口读出来。 

下面这个示例的函数可以把给定的DOS命令执行一遍,并把DOS下的输出内容记录在buffer中。同时示范了匿名管道重定向输出的用法:


[cpp]  view plain copy
  1. //执行CMD命令返回命令结果
  2. BOOLGetCmdResult(const char * szDosCmd, CString &sRetVal) 
  3. {      
  4.     //创建管道
  5.     SECURITY_ATTRIBUTES sa;  
  6.     HANDLE hRead,hWrite;  
  7.     sa.nLength = sizeof(SECURITY_ATTRIBUTES);  
  8.     sa.lpSecurityDescriptor = NULL;  
  9.     sa.bInheritHandle = TRUE;  
  10.     if (!CreatePipe(&hRead,&hWrite,&sa,0))   
  11.     {  
  12.         return FALSE;  
  13.     }   
  14.  
  15.     //组装命令行,长达1K的命令行,应该够用
  16.     char command[1024];
  17.     strcpy(command,"Cmd.exe /C ");  
  18.     strcat(command,szDosCmd);  
  19.  
  20.     //返回进程在启动时被指定的STARTUPINFO结构
  21.     STARTUPINFO si;  
  22.     PROCESS_INFORMATION pi;   
  23.     si.cb = sizeof(STARTUPINFO);  
  24.     GetStartupInfo(&si);   
  25.     si.hStdError = hWrite;            //把创建进程的标准错误重定向到管道输入  
  26.     si.hStdOutput = hWrite;           //把创建进程的标准输出重定向到管道输入  
  27.     si.wShowWindow = SW_HIDE;  
  28.     si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;   
  29.  
  30.     //执行命名,创建子进程 
  31.     //第五个参数bInHeritHandles也是一定要设置为TRUE,因为既然要让新进程能输出信息到调用他的进程里,就必须让新的进程继承调用进程的句柄.
  32.     if (!CreateProcess(NULL, command,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))   
  33.     {  
  34.         CloseHandle(hWrite);  
  35.         CloseHandle(hRead);  
  36.         return FALSE;  
  37.     }  
  38.  
  39.     //关闭管道输入
  40.     CloseHandle(hWrite);   
  41.  
  42.     //读取管道输出
  43.     DWORD dwRead = 0;
  44.     DWORD dwBlock = 4096;
  45.     char szBuffer[4096 + 1] = { 0 };
  46.     char buffer[4096] = {0};
  47.     DWORD bytesRead;   
  48.     while (ReadFile(hRead,buffer,4095,&bytesRead,NULL))   
  49.     {  
  50.         sRetVal += szBuffer;
  51.     }  
  52.  
  53.     //关闭管道输出
  54.     CloseHandle(hRead); 
  55.     return TRUE;  
  56. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值