| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 
 |  
void		WExec::createChildProcess(HANDLE& wr_h)
{
	TCHAR cmd[]=TEXT("toto");
	PROCESS_INFORMATION pi;
	STARTUPINFO si;
	BOOL bSuccess = FALSE;
 
	ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
	ZeroMemory(&si, sizeof(STARTUPINFO));
	si.cb = sizeof(STARTUPINFO);
	si.hStdError = stderr;
	si.hStdOutput = wr_h;
	si.hStdInput = stdin;
	si.dwFlags |= STARTF_USESTDHANDLES;
 
	if (CreateProcess(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
		std::cout << "Creating Process Succeed" << std::endl;
	else
	{
		std::cout << "Creating Process Failed" << std::endl;
		CloseHandle(pi.hProcess);
		CloseHandle(pi.hThread);
	}
}
 
void		WExec::readPipe(HANDLE& rd_p, HANDLE& wr_c)
{
	LPDWORD dr = 0, dw = 0;
	CHAR buf[BUFSIZE];	
	BOOL flag = FALSE;
	std::string	tmp;
 
	HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
	ZeroMemory(&buf, BUFSIZE);
	if (!CloseHandle(wr_c))
		std::cout << "Closing Child HANDLE Failed" << std::endl;
	else
		std::cout << "Closing Child Handle succeed" << std::endl;
	for (;;)
	{
		flag = ReadFile(rd_p, &buf, BUFSIZE, NULL, NULL);
		std::cout << GetLastError() << std::endl;	
		if (!flag || dr == 0)
			break;
		flag = WriteFile(out, buf, (DWORD)dr, dw, NULL);
		if (!flag)
			break;
	}
	CloseHandle(rd_p);
}
 
std::string&	WExec::execute(std::string& file, std::list<std::string> & param)
{
	SECURITY_ATTRIBUTES	sa;
	HANDLE wr_child = NULL;
	HANDLE rd_parent = NULL;
 
	sa.bInheritHandle = TRUE;
	sa.lpSecurityDescriptor = NULL;
	sa.nLength = sizeof(SECURITY_ATTRIBUTES);
 
	if (CreatePipe(&rd_parent, &wr_child, &sa, 0) == 0)
	{
		std::cout << "Error creating first pipe" << std::endl;
		return *(new std::string(""));
	}
	if (!SetHandleInformation(rd_parent, HANDLE_FLAG_INHERIT, 0))
	{
		std::cout << "Error in inheriting handle : " << GetLastError() << std::endl;
		return *(new std::string(""));
	}
 
	this->createChildProcess(wr_child);
	this->readPipe(rd_parent, wr_child);
	return *(new std::string(""));
} | 
Partager