StdHandle umleiten...



  • Ich hab ein kleines Programm programmiert mit dem man die stdHandle INPUT - OUTPUT der "cmd" umleiten kann. (Is nur zum testen natürlich kann man das einfacher mit system("cmd"); machen, will es aber mit Handle umleiten machen 🙂 )

    #include <windows.h>
    #include <iostream>
    #include <cstdlib>
    #include <shlwapi.h>
    
    #define BUFSIZE 4096
    
    using namespace std;
    
    int main()
    {
    	STARTUPINFO	si;
    	PROCESS_INFORMATION	pi;
    	SECURITY_ATTRIBUTES sa;
    	HANDLE hPipeOutRead,hPipeOutWrite, hPipeInRead, hPipeInWrite;
    	char cPipeResult[BUFSIZE], cPipeWrite[BUFSIZE];
    	DWORD dwBytesRead, dwBytesWrote;
    
    	//
    	// Erstellen der Pipe
    	sa.nLength=sizeof(sa);
    	sa.bInheritHandle=TRUE;
    	sa.lpSecurityDescriptor=NULL;
    	if(!CreatePipe(&hPipeOutRead,&hPipeOutWrite, &sa, 0))
    		cout<<"Fehler: "<<GetLastError();
    	if(!CreatePipe(&hPipeInRead,&hPipeInWrite, &sa, 0))
    		cout<<"Fehler: "<<GetLastError();
    	//
    	// Erstellen des Prozesses
    	si.cb=sizeof(STARTUPINFO);
    	si.lpReserved=NULL;
    	si.lpDesktop=NULL;
    	si.lpTitle=NULL;
    	si.dwX=0;
    	si.dwY=0;
    	si.dwXSize=640;
    	si.dwYSize=400;
    	si.dwXCountChars=0;
    	si.dwYCountChars=0;
    	si.dwFillAttribute=NULL;
    	si.dwFlags=STARTF_USESTDHANDLES;
    	si.wShowWindow=SW_HIDE;
    	si.cbReserved2=0;
    	si.lpReserved2=NULL;
    	si.hStdInput=hPipeInRead;
    	si.hStdOutput=hPipeOutWrite;
    	si.hStdError=GetStdHandle(STD_ERROR_HANDLE);
    
    	CreateProcess(NULL, "cmd", NULL, NULL, TRUE, CREATE_DEFAULT_ERROR_MODE|NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
    	WaitForSingleObject(pi.hProcess, 5000);
    	memset(cPipeResult,0,BUFSIZE);
    	ReadFile(hPipeOutRead,cPipeResult,sizeof(cPipeResult),&dwBytesRead,NULL);
    	cout<<cPipeResult;
    
    	while(true)
    	{
    		memset(cPipeWrite, 0, BUFSIZE);
    		cin>>cPipeWrite;
    		cPipeWrite[strlen(cPipeWrite)] = '\n';
    		if(!WriteFile(hPipeInWrite,cPipeWrite, sizeof(cPipeWrite),&dwBytesWrote,NULL))
    			cout<<"Fehler: "<<GetLastError();
    
    		WaitForSingleObject(pi.hProcess, 5000);
    		memset(cPipeResult,0,BUFSIZE);
    		if(!ReadFile(hPipeOutRead,cPipeResult,sizeof(cPipeResult),&dwBytesRead,NULL))
    			cout<<"Fehler: "<<GetLastError();
    		cout<<cPipeResult;
    	}
    
    	CloseHandle(pi.hProcess);
    	system("pause");
    	return 0;
    }
    

    Wenn man es ausführt funktioniert es beim ersten mal gut, wenn man das 2te mal einen Befehl eingibt wird immer "Mehr?" auf dem Bildschrim ausgegeben, weiß einer woran das liegen könnte!?

    Gr JO



  • Also ich hätte es eigentlich nur mit freopen gemacht...

    FILE *output = NULL;
    
    output = freopen("stdout.txt", "w", stdout);
    

    funzt auch mit stderr oder stdin.
    rya.
    Scorcher24

    edit: Was verbessert..



  • Werde es mal testen...vielleicht findet ja einer noch ne Lösung für das Problem wenn man es andes macht

    gr jo

    und danke schon mal...


Anmelden zum Antworten