匿名管道通信——重定向CMD.EXE
匿名管道
匿名管道無非就是系統核心管理的一塊記憶體區域,把這個檔案的句柄分為讀寫,以程式使用。
實作原理
是以重定向cmd.exe的标準輸入輸出分别為兩個匿名管道的輸入輸出即可。在GUI中對應接收和寫入内容(不要搞錯啦這裡,否則就讀不到正确的東西)。
程式大緻過程
①、匿名管道建立
BOOL WINAPI CreatePipe(
_Out_ PHANDLE hReadPipe, //匿名管道讀句柄
_Out_ PHANDLE hWritePipe, //匿名管道寫句柄
_In_opt_ LPSECURITY_ATTRIBUTES lpPipeAttributes, //這裡需要設定這個結構體(見下)
_In_ DWORD nSize //管道空間,設為0即預設大小
);
typedef struct _SECURITY_ATTRIBUTES {
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle;
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
②、打開cmd.exe子程序
BOOL WINAPI CreateProcess(
_In_opt_ LPCTSTR lpApplicationName,//執行子產品位置
_Inout_opt_ LPTSTR lpCommandLine,//執行子產品傳入指令
_In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ BOOL bInheritHandles,//繼承句柄
_In_ DWORD dwCreationFlags,
_In_opt_ LPVOID lpEnvironment,
_In_opt_ LPCTSTR lpCurrentDirectory,
_In_ LPSTARTUPINFO lpStartupInfo,//啟動資訊(見下)
_Out_ LPPROCESS_INFORMATION lpProcessInformation//程序資訊(為空即可)
);
typedef struct _STARTUPINFO {//此處隻寫本次索要用到的
DWORD cb;//大小
LPTSTR lpReserved;
LPTSTR lpDesktop;
LPTSTR lpTitle;
DWORD dwX;
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;//STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW顯示自己設定的模式
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;//标準輸入句柄
HANDLE hStdOutput;//标準輸出句柄
HANDLE hStdError;//标準錯誤句柄
} STARTUPINFO, *LPSTARTUPINFO;
到這裡其實已經都配置完了,無非是自己再寫個多線程讓UI和WORKER分開運作,讀取和寫入。值得提醒的是,對于cmd.exe的寫入時,需要在字元串後+“\r\n”,重新整理緩沖。這裡把CreatePipe寫出來,防止弄混:GUI讀取句柄+CMD.EXE寫入句柄,GUI寫入句柄+CMD.EXE讀取句柄,這樣兩對組成兩個匿名管道。
源碼下載下傳連結
http://download.csdn.net/detail/yzt33/8521139 很喜歡程式設計,喜歡深入了解一切的實作,作為新人,希望前輩們多多指正,多多鼓勵,謝謝。