首先是MFC,注意事项:
1、管道读写是FIFO
2、读写指针,要记得关闭
3、编译时用了UNICODE,但CMD读取回来时ANSI,所以要转换一下字符集
SECURITY_ATTRIBUTES sa; ZeroMemory(&sa, sizeof(sa)); sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; HANDLE hRead, hWrite; if (!CreatePipe(&hRead, &hWrite, &sa, 0)) { MessageBox(L"Error On CreatePipe()"); return; } STARTUPINFO si; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(STARTUPINFO); GetStartupInfo(&si); si.hStdError = hWrite; si.hStdOutput = hWrite; si.wShowWindow = SW_HIDE; si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(pi)); if (!::CreateProcess(L"C:\\Windows\\System32\\cmd.exe", L"/c dir /b D:\\Downloads" , NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi)) { showMeErrorInfo(); return; } CloseHandle(hWrite); char buffer[4096] = { 0 }; DWORD bytesRead; while (true) { if (ReadFile(hRead, buffer, 4095, &bytesRead, NULL) == NULL) { break; } UINT CodePage = 0; DWORD dwNum; dwNum = MultiByteToWideChar(CodePage, 0, buffer, -1, NULL, 0); if (dwNum) { wchar_t *pwText; pwText = new TCHAR[dwNum]; if (pwText) { MultiByteToWideChar(CodePage, 0, buffer, -1, pwText, dwNum); } //m_Edit.SetWindowText(pwText); delete[]pwText; pwText = NULL; } UpdateData(false); Sleep(200); } CloseHandle(hRead);
C#的话,就简单多了:
ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = "C:\\Windows\\System32\\cmd.exe"; startInfo.Arguments = "/c dir /b D:\\Downloads"; startInfo.RedirectStandardOutput = true; //startInfo.RedirectStandardError = true; startInfo.UseShellExecute = false; startInfo.CreateNoWindow = false; Process p=Process.Start(startInfo); String cmdOut = ""; while(!p.HasExited) { cmdOut = p.StandardOutput.ReadLine(); textBox1.Text += cmdOut + "\r\n"; p.WaitForExit(10); } cmdOut = p.StandardOutput.ReadToEnd() + "\r\n"; textBox1.Text += cmdOut ;