DOS-Shell über Pipe steuern



  • Hallo,

    ich möchte gerne über mein Programm die DOS-Shell auslesen und Befehle hinschicken. Bisher klappt das auslesen mit dem Code den ich bisher geschrieben hab auch so wie gewünscht.
    Wie kann ich denn jetzt von meinem Programm aus Befehle zur DOS-Shell senden um diese dann im nachhinein wieder auszulesen?

    #include <windows.h>
    #include <stdio.h>
    #include <cstringt.h>
    
    int main(void)
    {
    	LPTSTR exe = _T("C:\\Windows\\System32\\cmd.exe");
    	LPTSTR cmd = _T(" /k dir ");
    
    	// *************************************
        // Pipe
        HANDLE hReadPipe;
        HANDLE hWritePipe;
        SECURITY_ATTRIBUTES sa;
    
        //Sicherheitshinweise der Pipe
        sa.nLength= sizeof(SECURITY_ATTRIBUTES); //Wie groß die Struktur SEC_ATR ist
        sa.lpSecurityDescriptor = NULL;             //Zugriffsrechte für jeden
        sa.bInheritHandle = TRUE;  
    
    	// Deklarationen für Lesebefehl
    	char szBuffer[1024]; 
    	memset(szBuffer, 0, sizeof(szBuffer));
    
    	DWORD dwBytesRead;
    	DWORD dwBytesToRead = sizeof(szBuffer);
    
    	// Erstellen
    	if(!CreatePipe(&hReadPipe, &hWritePipe, &sa, 0))
    	{
    		printf("Problem :%d",GetLastError);
    	}
    	else
    	{
    		printf("Pipe started...\n");
    	}
    
    	// *************************************
    	// Porcess
    	STARTUPINFO si;                // Infos über Größe,Ort usw der Child App.
    	PROCESS_INFORMATION pi;        // Gibt Infos über Process ID, Handle, Thread usw. Für Child App.    
    	ZeroMemory(&si, sizeof(si) );
    	si.cb = sizeof(si);            // Größe der Struktur in Bytes wird hier ermittelt.
    	ZeroMemory(&pi, sizeof(pi) );
    	si.hStdInput = NULL;
    	si.hStdOutput = hWritePipe;
    	si.hStdError = hWritePipe;
    	si.dwFlags = STARTF_USESTDHANDLES;
    
    	// Prozess erstellen, also dos-shell im Hintergrund aufrufen
    	if(!CreateProcess(exe, cmd, NULL, NULL, TRUE, FALSE, NULL, NULL, &si, &pi))
    	{
    		printf("CreateProcess failed (%d)\n", GetLastError());
    		return 0;
    	}
    	else
    	{
    		printf("CreateProcess started...\n");
    	}
    
    	// Kanal zum Schreiben schließen
    	CloseHandle(hWritePipe);
    
    	// Daten von DOS-Shell lesen und ausgeben
    	while(ReadFile(hReadPipe, szBuffer, (dwBytesToRead - 1), &dwBytesRead, NULL) && GetLastError() != ERROR_BROKEN_PIPE)
    	{
    		printf(szBuffer);
    		memset(szBuffer, 0 , sizeof(szBuffer));
    	}
    
    	// Warten bis die cmd geschlossen wird
    	WaitForSingleObject( pi.hProcess, INFINITE );
    
    	// Die Shell Wieder aufräumen
    	CloseHandle( pi.hProcess );
    	CloseHandle( pi.hThread );
    
    	return 1;
    }
    


  • popen
    


  • Könntest du mir vielleicht ein kleines Beispiel geben wie ich das da am besten reinbastle?
    Wenn ich das so reinschreibe:

    FILE *fp;
    	fp = _popen("cd..", "w");
    
    	CloseHandle(hWritePipe);
    	// Daten von DOS-Shell lesen und ausgeben
    	while(ReadFile(hReadPipe, szBuffer, (dwBytesToRead - 1), &dwBytesRead, NULL) && GetLastError() != ERROR_BROKEN_PIPE)
    	{
    		printf(szBuffer);
    		memset(szBuffer, 0 , sizeof(szBuffer));
    	}
    

    wird leider nichts angezeigt



  • Ich hab hier mal was mit einer Pipe gemacht, vielleicht kannst Du damit was anfangen:
    http://www.c-plusplus.net/forum/248213



  • cool, echt super, funktioniert ja 😃

    Danke dir!


Anmelden zum Antworten