首先是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 ;