Results 1 to 5 of 5

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Registered User mitkohr's Avatar
    Join Date: Jul:2001
    Posts: 1,361

    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;
    }
    Ïðîöåñà ñå ñòàðòèðà óñïåøíî ... âèæäàì ìó îóòïóò-à, íî ôóíöèÿòà äåòî ÷åòå ìè ïèøå:
    Code:
    [ConOutReader] Started...
    [ConOutReader] hFile == 004250C0
    [ConOutReader] Error read:6 ... 0
    [ConOutReader] hFile == 004250C0
    [ConOutReader] Ending ...
    Ñïîðåä ñòàíäàðòíèòå Error Codes, òîâà å: 6L ERROR_INVALID_HANDLE
    Àìà êàòî ãëåäàì äîñòà âàëèäåí ìè èçãëåæäà õåíäúëà
    Òàêà ÷å àêî íÿêîé èìà èäåÿ äà ïîìàãà.
    Áëàãîäàðÿ ïðåäâàðèòåëíî.
    Ïîçäðàâè,
    Ìèòêî
    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

  2. #2
    Áåëûé è ïóøèñòûé Bombera's Avatar
    Join Date: Jul:2001
    Location: Êàçàíëúê 4EVA
    Posts: 13,833
    Ïî ïðèíöèï òîâà å ïîðåäíèÿ êóö ïðèìåð îò Ìàéêðîñîôò. Âèæ êîìåíòàðèòå ïîä ñòàòèÿòà.
    Îñâåí òîâà àç áèõ ãî íàïðàâèë ñ àñèíõðîííî ÷åòåíå(ReadFileEx), òîãàâà ñ åäèí wait, ìîæå äà ÷åòåø, ÊÎÃÀÒÎ è ÑÀÌÎ ÊÎÃÀÒÎ èìà äàííè çà ÷åòåíå, íå äà áëîêèðàø, ÄÎÊÀÒÎ äîéäàò äàííèòå è â ñúùèÿ wait ìîæå äà ñå äåáíå êîãà óìèðà ÷àéëä ïðîöåñúò è äà íå ñå ÷åòå ïîâå÷å. Îïåðàöèîííàòà ñèñòåìà ùå òè ñèãíàëèçèðà wait-a â ïðàâèëíèÿ ðåä - ïúðâî àêî èìà äà ñå ÷åòå, ÷åòåø, ïîñëå íà ñëåäâàùèÿ lîop(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|Áåç èñòèíñêî âîäíî

  3. #3
    Registered User
    Join Date: Feb:2006
    Location: Plovdiv
    Posts: 392
    Ìîæå áè ïðîáëåìà å ÷å ïðåäàâàø ìàíèïóëàòîðà çà ïîòîêà ïî àäðåñ, à ïîñëå ãî èçïîëçâàø àäðåñà êàòî ìàíèïóëàòîð(âúâ ôóíêöèÿòà).

  4. #4
    Áåëûé è ïóøèñòûé Bombera's Avatar
    Join Date: Jul:2001
    Location: Êàçàíëúê 4EVA
    Posts: 13,833
    Quote Originally Posted by JanBird View Post
    Ìîæå áè ïðîáëåìà å ÷å ïðåäàâàø ìàíèïóëàòîðà çà ïîòîêà ïî àäðåñ, à ïîñëå ãî èçïîëçâàø àäðåñà êàòî ìàíèïóëàòîð(âúâ ôóíêöèÿòà).
    Òîâà å òàêà, ïðîñòî ãî êàñòíè ÿâíî êúì LPVOID â èçâèêâàíåòî íà CreateThread.
    Çíà÷è âñå ïàê íÿìà àóòïóò.
    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|Áåç èñòèíñêî âîäíî

  5. #5
    Registered User mitkohr's Avatar
    Join Date: Jul:2001
    Posts: 1,361
    Ðåøèõ ïðîáëåìà, íà êîéòî ìó å èíòåðåñíî - íå å ìíîãî åëåãàíòíî íî òàêà çàðàáîòè
    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

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  

Copyright © 1999-2011 Õàðäóåð ÁÃ. Âúçìîæíî å ñúäúðæàíèåòî íà òàçè ñòðàíèöà äà å îáåêò íà àâòîðñêè ïðàâà.
iskamPC.com | mobility.BG | Bloody's Techblog | Êðèïòîâàëóòè è ìàéíèíã | 3D Vision Blog | Ìàãàçèí çà åëåêòðîííè öèãàðè