Results 1 to 5 of 5
Thread: Win32: output child
Hybrid View
-
17th November 2009 18:48 #1
Win32: output child
,
, output child
: http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx :
... -, :Code:int SQSListener::execSQSCommand(tstring command, tstring* retLine) { PROCESS_INFORMATION pi; SECURITY_ATTRIBUTES sa; STARTUPINFO si; HANDLE hThread = INVALID_HANDLE_VALUE; DWORD ID; ZeroMemory(&si, sizeof(si)); ZeroMemory(&pi, sizeof(pi)); ZeroMemory(&sa, sizeof(sa)); //retLine = new tstring(_T("")); sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; if(!CreatePipe(&hConOutRead, &hConOutWrite, &sa, 0)) { exit(ERROR_PIPE); } si.cb = sizeof(si); GetStartupInfo(&si); si.hStdOutput = hConOutWrite; si.hStdError = hConOutWrite; si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; //si.wShowWindow = SW_HIDE; tcout << _T("Executing: ") << command << endl; if(!CreateProcess(NULL, (LPWSTR)command.c_str(), NULL, NULL, FALSE, CREATE_NEW_CONSOLE|CREATE_SUSPENDED, NULL, NULL, &si, &pi)) { tcout << _T("Error creating process:") << GetLastError() << _T("! Exiting....") << endl; exit(ERROR_PROCESS); } stdOutLines = new vector<tstring>(); toRun = TRUE; hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&::ConOutReader, &hConOutRead, 0, &ID); if(hThread == INVALID_HANDLE_VALUE) { tcout << _T("Error getting thread output:") << GetLastError() << _T("! Exiting....") << endl; exit(ERROR_PROCESS); } ResumeThread(pi.hThread); WaitForSingleObject(pi.hThread, INFINITE); toRun = FALSE; ID = 0L; GetExitCodeProcess(pi.hProcess, &ID); WaitForSingleObject(hThread, INFINITE); if(ID == 0L) { if(!stdOutLines->empty()) { retLine->assign(stdOutLines->at(0)); tcout << _T("Command exec with code == 0 ... ") << *retLine << endl; } } else { tcout << _T("Command exec with code == ") << ID << endl; for(int i = 0; i < stdOutLines->size(); i++) { tcout << _T("[OUTPUT]") << stdOutLines->at(i) << endl; } retLine->assign(_T("")); } CloseHandle(pi.hThread); CloseHandle(pi.hProcess); CloseHandle(hThread); CloseHandle(hConOutRead); CloseHandle(hConOutWrite); delete stdOutLines; return ID; } DWORD WINAPI ConOutReader( LPVOID param) { TCHAR buff[250]; DWORD readBytes; tstring line(_T("")); tcout << _T("[ConOutReader] Started...") << endl; readBytes = -1L; HANDLE hFile = (HANDLE)param; if(hFile == INVALID_HANDLE_VALUE) { tcout << _T("[ConOutReader] hFile == INVALID_HANDLE_VALUE") << endl; } else { tcout << _T("[ConOutReader] hFile == ") << hFile << endl; } while( readBytes != 0 ) { ZeroMemory(buff, 250); if(ReadFile(hFile, buff, 249, &readBytes, NULL) == 0) { tcout << _T("[ConOutReader] Error read:") << GetLastError() << _T(" ... ") << readBytes << endl; tcout << _T("[ConOutReader] hFile == ") << hFile << endl; break; } tcout << _T("[ConOutReader] Read:") << buff << endl; line = buff; stdOutLines->push_back(line); } tcout << _T("[ConOutReader] Ending ...") << endl; return 0L; }
Error Codes, : 6L ERROR_INVALID_HANDLECode:[ConOutReader] Started... [ConOutReader] hFile == 004250C0 [ConOutReader] Error read:6 ... 0 [ConOutReader] hFile == 004250C0 [ConOutReader] Ending ...

.
.
,
Gigabyte X570 Aorus Elite, AMD Ryzen 7 5800X@PBO+200, Noctua NH-D15, 2x16GB G.Skill F4-3600C17D-32GTZR, Palit GeForce RTX 4070 Ti GameRock Classic, 2x Sandisk Extreme II 240GB (not in RAID)+WD 320GB AAKS + WD40EZRZ + Toshiba X300 6GB, Cooler Master HAF 922, CORSAIR 750W CX
-
17th November 2009 19:13 #2
. .
(ReadFileEx), wait, , , , wait . wait-a - , , lop(wait-a e loop) wait-a child - . wait, , .
.. ( , CreateThread, a beginthread/ex, , ). .
, GetLastError() , , .
P.P.S. .Last edited by Bombera; 18th November 2009 at 11:49.
EVGA X299 FTW K|i9-7960X@4.7|4x8 Patriot Viper Steel 4000|GTX 1660 Ti|970 EVO 1 TB|Seasonic Focus GX-1000|Xigmatek Elysium|
Rampage IV Extreme BE|E5-1680v2@4.7|4x4 HyperX 1866|Cougar Aqua 240|GTX 1050 Ti|970 EVO 1/4 TB|CM 850 SilentPro|HAF-X|
-
17th November 2009 21:10 #3Registered User
Join Date: Feb:2006
Location: Plovdiv
Posts: 392
, ( ).
-
17th November 2009 22:10 #4
-
23rd November 2009 17:29 #5
, -

Code:typedef struct _PROC_PARAM { tstring retStr; HANDLE hFile; } PROC_PARAM, *LPPROC_PARAM; int SQSListener::execSQSCommand(tstring command, tstring* retLine, TCHAR* workDir) { HANDLE hDefStdOut = INVALID_HANDLE_VALUE; HANDLE hDefStdErr = INVALID_HANDLE_VALUE; HANDLE hNewStdOut = INVALID_HANDLE_VALUE; HANDLE hNewStdIn = INVALID_HANDLE_VALUE; HANDLE hThread = INVALID_HANDLE_VALUE; SECURITY_ATTRIBUTES sa; DWORD bytes; TCHAR tmp[256]; STARTUPINFO si; PROCESS_INFORMATION pi; hDefStdOut = GetStdHandle(STD_OUTPUT_HANDLE); hDefStdErr = GetStdHandle(STD_ERROR_HANDLE); tcout << _T("Will execute ") << command << endl; ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES)); sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; if(!CreatePipe(&hNewStdIn, &hNewStdOut, &sa, 0)) { SetStdHandle(STD_OUTPUT_HANDLE, hDefStdOut); SetStdHandle(STD_ERROR_HANDLE, hDefStdErr); tcout << _T("Error creating pipe for output redir: ") << GetLastError() << endl; return ERROR_PIPE; } if(!SetStdHandle(STD_OUTPUT_HANDLE, hNewStdOut)) { SetStdHandle(STD_OUTPUT_HANDLE, hDefStdOut); SetStdHandle(STD_ERROR_HANDLE, hDefStdErr); CloseHandle(hNewStdIn); CloseHandle(hNewStdOut); tcout << _T("Error setting STD_OUTPUT_HANDLE: ") << GetLastError() << endl; return ERROR_PIPE; } if(!SetStdHandle(STD_ERROR_HANDLE, hNewStdOut)) { bytes = GetLastError(); SetStdHandle(STD_OUTPUT_HANDLE, hDefStdOut); SetStdHandle(STD_ERROR_HANDLE, hDefStdErr); CloseHandle(hNewStdIn); CloseHandle(hNewStdOut); tcout << _T("Error setting STD_ERROR_HANDLE: ") << bytes << endl; return ERROR_PIPE; } ZeroMemory(&si, sizeof(STARTUPINFO)); ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); if(!CreateProcess(NULL, (LPWSTR)command.c_str(), NULL, NULL, TRUE, CREATE_SUSPENDED, NULL, (LPWSTR)workDir, &si, &pi)) { bytes = GetLastError(); SetStdHandle(STD_OUTPUT_HANDLE, hDefStdOut); SetStdHandle(STD_ERROR_HANDLE, hDefStdErr); CloseHandle(hNewStdIn); CloseHandle(hNewStdOut); tcout << _T("Error starting the process: ") << bytes << endl; return ERROR_PROCESS; } LPPROC_PARAM param = new PROC_PARAM(); param->retStr.empty(); param->hFile = hNewStdIn; hThread = CreateThread(NULL, 0, ConOutReader, (LPVOID)param, CREATE_SUSPENDED, &bytes); if(hThread == INVALID_HANDLE_VALUE) { bytes = GetLastError(); SetStdHandle(STD_OUTPUT_HANDLE, hDefStdOut); SetStdHandle(STD_ERROR_HANDLE, hDefStdErr); CloseHandle(hNewStdIn); CloseHandle(hNewStdOut); tcout << _T("Error creating listner thread:") << bytes << endl; TerminateProcess(pi.hProcess, -999); delete param; CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return ERROR_PROCESS; } ResumeThread(pi.hThread); ResumeThread(hThread); WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(hNewStdOut); WaitForSingleObject(hThread, INFINITE); retLine->clear(); retLine->append(param->retStr); delete param; bytes = GetExitCodeProcess(pi.hProcess, &bytes); SetStdHandle(STD_OUTPUT_HANDLE, hDefStdOut); SetStdHandle(STD_ERROR_HANDLE, hDefStdOut); CloseHandle(hNewStdIn); CloseHandle(hNewStdOut); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); CloseHandle(hThread); return bytes; } DWORD WINAPI ConOutReader( LPVOID param1) { LPPROC_PARAM params = (LPPROC_PARAM)param1; tstring temp; temp.clear(); params->retStr.clear(); while(readFromHandle(temp, params->hFile) && !temp.empty()) { params->retStr.append(temp); } return GetLastError(); } BOOL WINAPI readFromHandle(tstring& message, HANDLE hStream) { char buff[256]; TCHAR *mess = NULL; DWORD size = 0L; BOOLEAN bSuccess = FALSE; message.clear(); if(!(bSuccess = ReadFile(hStream, buff, 256, &size, NULL))) { return bSuccess; } if(size >= 0 && size < 256) { buff[size] = 0; } mess = new TCHAR[size]; size = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, buff, size, mess, size); mess[size] = 0; message.append(mess); //delete mess; return bSuccess; }Gigabyte X570 Aorus Elite, AMD Ryzen 7 5800X@PBO+200, Noctua NH-D15, 2x16GB G.Skill F4-3600C17D-32GTZR, Palit GeForce RTX 4070 Ti GameRock Classic, 2x Sandisk Extreme II 240GB (not in RAID)+WD 320GB AAKS + WD40EZRZ + Toshiba X300 6GB, Cooler Master HAF 922, CORSAIR 750W CX




Reply With Quote

Lenovo ThinkPad 15 IdeaPad 15
5th May 2023, 22:16 in