#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
int runcmd( char* lpCmd )
{
char buf[2048] = {0}; //緩衝區
DWORD len;
HANDLE hRead, hWrite; // 管道讀寫控制代碼
STARTUPINFO si;
PROCESS_INFORMATION pi;
SECURITY_ATTRIBUTES sa;
//ZeroMemory( buf, 2047 );
sa.nLength = sizeof( sa );
sa.bInheritHandle = TRUE; // 管道控制代碼是可被繼承的
sa.lpSecurityDescriptor = NULL;
// 建立匿名管道,管道控制代碼是可被繼承的
if( !CreatePipe( &hRead, &hWrite, &sa, 2048 ) )
{
printf( "管道建立失敗!(%#X)\n", (unsigned int)GetLastError() );
return 1;
}
ZeroMemory( &si, sizeof( si ) );
si.cb = sizeof( si );
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
si.hStdError = hWrite;
si.hStdOutput = hWrite;
// 建立子進程,運行命令,子進程是可繼承的
if ( !CreateProcess( NULL, lpCmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi ) )
{
printf( "建立進程失敗!(%#x)\n", (unsigned int)GetLastError() );
CloseHandle( hRead );
CloseHandle( hWrite );
return 1;
}
// 寫端控制代碼已被繼承,本地需要關閉,不然讀管道時將被阻塞
CloseHandle( hWrite );
// 讀管道內容,並顯示
while ( ReadFile( hRead, buf, 2047, &len, NULL ) )
{
printf( buf );
ZeroMemory( buf, 2047 );
}
CloseHandle( hRead );
return 0;
}
int main( int argc, char** argv )
{
char cmd[256];
printf( "輸入命令列:" );
gets( cmd );
runcmd( cmd );
system( "pause" );
return 0;
}
女孩不哭(191035066)@2011-12-05 19:26:50