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 - , , 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|

  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 |