int _tmain(int argc, _TCHAR* argv[]) { //create pipe for the console stdout SECURITY_ATTRIBUTES sa; ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES)); sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle = true; sa.lpSecurityDescriptor = NULL; HANDLE ReadPipeHandle; HANDLE WritePipeHandle; // not used here if (!CreatePipe(&ReadPipeHandle, &WritePipeHandle, &sa, 0)) return -1; //Create a Console STARTUPINFO si; ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; si.wShowWindow = SW_HIDE; si.hStdOutput = WritePipeHandle; si.hStdError = WritePipeHandle; PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); if (!CreateProcess(_T("c:\\Windows\\System32\\cmd.exe"), NULL, NULL, NULL, true, 0, NULL, NULL, &si, &pi)) return -1; //Read from pipe char Data[1024]; ZeroMemory(Data, 1024); for (;;) { DWORD BytesRead; DWORD TotalBytes; DWORD BytesLeft; //Check for the presence of data in the pipe if (!PeekNamedPipe(ReadPipeHandle, Data, sizeof(Data), &BytesRead, &TotalBytes, &BytesLeft)) return -1; //If there is bytes, read them if (BytesRead) { if (!ReadFile(ReadPipeHandle, Data, sizeof(Data) - 1, &BytesRead, NULL)) return -1; puts(Data); } else { //Is the console app terminated? if (WaitForSingleObject(pi.hProcess, 0) == WAIT_OBJECT_0)break; } } CloseHandle(pi.hThread); CloseHandle(pi.hProcess); CloseHandle(ReadPipeHandle); CloseHandle(WritePipeHandle); return 0; }