管道截獲win 32 exe 的printf消息

SECURITY_ATTRIBUTES sa;
HANDLE hRead,hWrite;


sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead,&hWrite,&sa,0)) 
{
return;

char command[1024]; //長達1K的命令行,夠用了吧
strcpy(command,"Cmd.exe /C ");
strcat(command,para_sys);
STARTUPINFO si;
PROCESS_INFORMATION pi; 
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si); 
si.hStdError = hWrite; //把創建進程的標準錯誤輸出重定向到管道輸入
si.hStdOutput = hWrite; //把創建進程的標準輸出重定向到管道輸入
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
//關鍵步驟,CreateProcess函數參數意義請查閱MSDN



if (!CreateProcess(NULL, A2W(command),NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) 
{
CloseHandle(hWrite);
CloseHandle(hRead);
AfxMessageBox(_T("Feature Detection Failed!"));
return;
}
CloseHandle(hWrite);


char buffer[4096] = {0}; //用4K的空間來存儲輸出的內容,只要不是顯示文件內容,一般情況下是夠用了。
DWORD bytesRead; 
while (true) 
{
if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
break;
//buffer中就是執行的結果,可以保存到文本,也可以直接輸出
AfxMessageBox(A2W(buffer)); //這裏是彈出對話框顯示
}
CloseHandle(hRead);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章