// 所有原创文章转载请注明作者及链接
// blackboycpp(AT)gmail.com
// QQ群: 135202158
前一篇文章已经实现了基本功能,但有一个问题,就是需要读写硬盘上的文件。
如果实在不想读写文件,可以将进程启动信息中的输出重定向到一个匿名管道,再从管道中读取进程的输出即可。
- void CCPTFDlg::OnBnClickedBtnPing()
- {
- UpdateData(TRUE);
-
- BOOL bRet = FALSE;
-
- CString sAddr;
- GetDlgItem(IDC_EDIT_ADDR)->GetWindowText(sAddr);
- CString sCmdLine = _T("ping.exe ") + sAddr;
-
-
- SECURITY_ATTRIBUTES sa;
- ::ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
- sa.nLength = sizeof(SECURITY_ATTRIBUTES);
- sa.bInheritHandle = TRUE;
- sa.lpSecurityDescriptor = NULL;
-
-
- HANDLE hPipeRead, hPipeWrite;
- bRet = ::CreatePipe(&hPipeRead, &hPipeWrite, &sa, 0);
- ASSERT(bRet == TRUE);
-
-
- STARTUPINFO si;
- ::ZeroMemory(&si, sizeof(STARTUPINFO));
- si.cb = sizeof(STARTUPINFO);
- si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
- si.hStdOutput = hPipeWrite;
- si.wShowWindow = SW_HIDE;
-
-
- PROCESS_INFORMATION pi;
- ::ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
-
-
-
- bRet = ::CreateProcess(NULL, sCmdLine.GetBuffer(), NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi);
- ASSERT(bRet == TRUE);
-
-
- ::WaitForSingleObject(pi.hProcess, INFINITE);
-
- ::CloseHandle(pi.hProcess);
- ::CloseHandle(pi.hThread);
-
-
- char buffer[1024] = {0};
- DWORD dwBytesRead;
- bRet = ::ReadFile(hPipeRead, buffer, 1023, &dwBytesRead, 0);
- ASSERT(bRet == TRUE);
- ASSERT(dwBytesRead > 0);
- GetDlgItem(IDC_EDIT_OUT)->SetWindowText(CString(buffer));
-
-
- ::CloseHandle(hPipeRead);
- ::CloseHandle(hPipeWrite);
- }
界面和其余部分与上一篇提到的小例子相同。