bool RunDOSCommand(const std::string &strCmd, std::string &strRet)
{
SECURITY_ATTRIBUTES sa = { 0 };
STARTUPINFOA si = { 0 };
PROCESS_INFORMATION pi = { 0 };
HANDLE hPipeOutputRead = INVALID_HANDLE_VALUE;
HANDLE hPipeOutputWrite = INVALID_HANDLE_VALUE;
HANDLE hPipeInputRead = INVALID_HANDLE_VALUE;
HANDLE hPipeInputWrite = INVALID_HANDLE_VALUE;
DWORD dwNumberOfBytesRead = 0;
DWORD dwNumberOfBytesWrite = 0;
CHAR szBuffer[1024];
sa.nLength = sizeof(sa);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
::CreatePipe(&hPipeOutputRead,
&hPipeOutputWrite,
&sa,
0
);
::CreatePipe(&hPipeInputRead,
&hPipeInputWrite,
&sa,
0
);
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdInput = hPipeInputRead;
si.hStdOutput = hPipeOutputWrite;
si.hStdError = hPipeOutputWrite;
::CreateProcessA(
NULL, (char*)strCmd.data(),
NULL, NULL,
TRUE, 0,
NULL, NULL,
&si, &pi);
::CloseHandle(hPipeOutputWrite); hPipeOutputWrite = INVALID_HANDLE_VALUE;
::CloseHandle(hPipeInputRead); hPipeInputRead = INVALID_HANDLE_VALUE;
while (TRUE)
{
::ReadFile(
hPipeOutputRead,
&szBuffer,
sizeof(szBuffer) - 1,
&dwNumberOfBytesRead,
NULL
);
if (dwNumberOfBytesRead == 0) break;
szBuffer[dwNumberOfBytesRead] = 0;
strRet += szBuffer;
}
::WaitForSingleObject(pi.hProcess, INFINITE);
::CloseHandle(pi.hThread);
::CloseHandle(pi.hProcess);
::CloseHandle(hPipeOutputRead);
::CloseHandle(hPipeInputWrite);
return true;
}