#include <windows.h>
#include <iostream>
#include <string>
using namespace std;

int doscommand(string cmd, string &output){
//パイプ作成
SECURITY_ATTRIBUTES sa={0};
sa.nLength = sizeof( SECURITY_ATTRIBUTES );
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
HANDLE hReadPipe, hWritePipe ;
CreatePipe( &hReadPipe, &hWritePipe, &sa, 50000 );
// 起動情報設定
STARTUPINFO si={0};
si.cb = sizeof( STARTUPINFO );
si.dwFlags = STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdOutput = hWritePipe;
PROCESS_INFORMATION pi;
//コマンド実行
if(!CreateProcess(NULL, &cmd[0] , NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi ))
{ cmd ="cmd.exe /C "+cmd; // CreateProcessはdosの内部コマンドを実行できない
if(!CreateProcess(NULL, &cmd[0] , NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi ))return 0;}
//出力を保存
unsigned long n, m=0, r, errcnt=0, flg=0;
while (!flg){
if(WaitForSingleObject( pi.hProcess, 100)==WAIT_OBJECT_0)flg=1;
PeekNamedPipe( hReadPipe, NULL, 0, NULL, &n, NULL );
if( n == 0 ) { errcnt++; if(errcnt>30) break; else continue; }
errcnt=0;
if( n+m > output.capacity() ) output.reserve(2*(n>m?n:m));
output.resize(m+n);
ReadFile( hReadPipe, &output[m], n, &r, NULL );
m+=r; }
//終了処理
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
CloseHandle( hWritePipe );
CloseHandle( hReadPipe );
return 1; }

main(){
string a;
cout<< doscommand("dir",a);
cout<< a; }