管道是一種在程序間共享資料的機制,其實質是一段共享記憶體。windows系統為這段共享的記憶體設計使用資料流i/o的方式來訪問。乙個程序讀,另乙個程序寫,這類似於乙個管道的兩端,因此這種程序間的通訊方式稱為「管道」。管道分為匿名管道和命名管道。匿名管道只能在父子程序間進行通訊,不能在網路間通訊,而且資料傳輸是單向的,只能一端寫,另一端讀。命名管道可以在任意程序間通訊,通訊是雙向的,任意一端都可讀可寫,但是在同一時間只能有一端讀、一端寫。建立命名管道的方式可以獲取cmd執行結果的輸出內容
(1).呼叫函式createpipe建立匿名管道,獲取管道資料讀取控制代碼和管道資料寫入控制代碼。
(2).建立新程序(程序屬性為視窗隱藏、視窗的快取控制代碼設定為上面得到的管道資料寫入控制代碼)
(3).呼叫函式waitforsingleobject等待命令執行完畢
(4).呼叫readfile函式根據匿名管道的資料讀取控制代碼從匿名管道的緩衝區中讀取資料
(5).關閉控制代碼,釋放資源
//************************************
//函式名:ccmddlg::pipecmd
//返回型別:bool
//功能: 執行cmd命令, 並獲取執行結果資料
//引數1:char *pszcmd cmd命令
//引數2:char *pszresultbuffer 接收cmd結果的緩衝區
//引數3:dword dwresultbuffersize 緩衝區大小(緩衝區要大點,不然接收到的結果不全)
//************************************
bool ccmddlg::pipecmd(char *pszcmd, char *pszresultbuffer, dword dwresultbuffersize)
;
//設定管道的安全屬性
securityattributes.binherithandle =true;
securityattributes.nlength = sizeof
(securityattributes);
securityattributes.lpsecuritydescriptor =null;
//建立匿名管道
handle hreadpipe =null;
handle hwritepipe =null;
bool bret = ::createpipe(&hreadpipe, &hwritepipe, &securityattributes, 0
);
if (false ==bret)
startupinfo si = ;
//設定新程序引數
si.cb = sizeof
(si);
si.hstderror =hwritepipe;
si.hstdoutput =hwritepipe;
si.wshowwindow =sw_hide;
si.dwflags = startf_useshowwindow |startf_usestdhandles;
//建立新程序執行命令, 將執行結果寫入匿名管道中
process_information pi = ;
uses_conversion;
bret = ::createprocess(null, a2w(pszcmd), null, null, true, 0, null, null, &si, &pi);
if (false ==bret)
//等待命令執行結束
::waitforsingleobject(pi.hthread, infinite);
::waitforsingleobject(pi.hprocess, infinite);
//從匿名管道中讀取結果到輸出緩衝區
::rtlzeromemory(pszresultbuffer, dwresultbuffersize);
::readfile(hreadpipe, pszresultbuffer, dwresultbuffersize, null, null);
//關閉控制代碼, 釋放記憶體
::closehandle(pi.hthread);
::closehandle(pi.hprocess);
::closehandle(hwritepipe);
::closehandle(hreadpipe);
return
true;
}
VC 模擬CMD 匿名管道
include stdafx.h include include include int call char cmd startupinfo si process information pi zeromemory si,sizeof startupinfo si.cb sizeof startup...
通過匿名管道獲取CMD命令框輸出內容
以前有個人諮詢我說,要怎麼程式設計實現獲取控制台視窗或者是cmd視窗輸出的資料內容。當時水平有限,很多知識還不是很了解。但是憑藉著有一點基礎,而且之前在網路上瀏覽過相關的技術實現,還有些印象,便回答ta說,可以用匿名管道的方式來實現。管道是一種用於在程序間共享資料的機制,其實質是一段共享記憶體。wi...
C語言執行cmd命令並獲取執行結果
優點 跨平台 缺點 windows下呼叫時會閃出控制台視窗 include include brief 使用popen呼叫終端並獲取執行結果 param in cmd 命令內容 param out result 儲存結果的位址 return 0或1 執行狀態,失敗或成功 int exec cmd c...