DOS-Shell offen halten



  • Guten Morgen allerseits,
    ich bin gerad dabei eine GUI zu erstellen die bei Betätigung eines Buttons die DOS Eingabeaufforderung startet und dann in ein gewünschtes Verzeichnis wechselt und einen Befehl ausführt.
    z.B.: C:\Program Files>dir

    ich benutze dafür shell execute:

    LPTSTR exe = _T("C:\\Windows\\System32\\cmd.exe");
    	LPTSTR dir = _T("C:\\Program Files\\");
    
    	ShellExecute(0, _T("open"), exe, NULL, dir, SW_SHOWNORMAL);
    

    Meine Frage, wie kann man nun einen Befehl, wie "dir" in die Shell reinschreiben und ausführen?

    Danke im Voraus



  • Ich verstehe zwar den Titel nicht so ganz aber das, was du brauchst findest du hier: http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153%28v=vs.85%29.aspx
    du kannst dem Ding Parameter mitgeben, in deinem Fall wäre das

    LPTSTR exe = _T("C:\\Windows\\System32\\cmd.exe");
    	LPTSTR dir = _T("C:\\Program Files\\");
    	LPTSTR cmd = _T(" /C dir");
    
    	ShellExecute(NULL, _T("open"), exe, cmd, dir, SW_SHOWNORMAL);
    


  • Danke für die schnelle Antwort. Ja das mit dem Titel war weil ich das vorher mit system("dir") gemacht habe und dann die Shell direkt zu gegangen ist. Genau wie mit deinem Code. Wie kann ich die denn offen halten?



  • LPTSTR cmd = _T(" /k dir");
    


  • Aaaah, ok danke

    weiß noch jemand wie ich den Inhalt der DOS-Shell auslesen kann?



  • LPTSTR cmd = _T(" /k cmd.exe > dat.txt");
    

    speichert deinen Konsoleninhalt in einer Textdatei

    Aber mal so ne Frage am Rande: Was zum Teufel hast du denn vor?!



  • also das ziel des ganzen ist, dass die quasi in meine gui eine kommandozeile einbette um befehle an die dos shell zu schicken.
    im gegenzug soll ein cedit-feld alles, was die dos schreibt auch anzeigen.

    und da komme ich jetzt nicht mehr weiter. hat jemand noch eine idee?



  • Du suchst eine pipe.



  • hab hier was gefunden, allerdings hab ich dafür erstmal eine konsolenanwendung gemacht, beim kompilieren bekomm ich allerdings noch ein paar fehler. funktioniert der code bei euch?

    #include <windows.h>
    #include <tchar.h>
    #include <stdio.h>
    
    int main(void)
    {
        //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;                
    
        //PROCESS
        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) );
    
        //PROZESS ERSTELLEN
        if(!CreateProcess(NULL,
            "C:\\WINDOWS\\system32\\cmd.exe",
            NULL,
            NULL,
            FALSE,
            0,
            NULL,
            NULL,
            &si,
            &pi))
        {
            printf("CreateProcess failed (%d)\n", GetLastError());
            return 0;
        }
        else printf("CreateProcess started...\n");
    
        //PIPE ERSTELLEN
        if(!CreatePipe(&hReadPipe, &hWritePipe, &sa, 0))
            printf("Problem :%d",GetLastError);
        else printf("Pipe started...\n");
    
        //Warten bis die cmd geschlossen wird
        WaitForSingleObject( pi.hProcess, INFINITE );
    
        //Die Shell Wieder aufräumen
        CloseHandle( pi.hProcess );
        CloseHandle( pi.hThread );
    
        return 1;
    }
    


  • Das kann doch nicht funktionieren ...

    Erstmal hat der Prozess in deinem Beispiel gar keine Verbindung zur
    Pipe. Es würde wohl Sinn machen die Pipe als erstes zu erstellen ...

    Wie wärs wenn du einfach das Beispiel aus der MSDN-Doku nimmst ?

    MSDN CreatePipe function

    http://msdn.microsoft.com/en-us/library/windows/desktop/aa365152.aspx

    Beispiel:

    For an example, see Creating a Child Process with Redirected Input and Output.


Anmelden zum Antworten