DOS output in Memo rein.



  • *schieb*



  • Ich tippe mal darauf, dass du kein DOS starten willst, sondern eine Konsole - lies dir zur Unterscheidung mal das hier durch: [URL][/URL].

    --- Theorie 1: Du willst in deinem Programm eine neue Konsole haben:

    Also mit AllocConsole() bekommst du deine Konsole und dann kannst du sie mit der Funktion HideConsole() - ebenfalls aus der Konsolen-FAQ - verstecken. Es kann aber durchaus sein, dass sie kurz aufblitzt.

    Wie du den Text in ein TMemo bekommst weis ich nicht. Ich kann dir nur sagen wie du die Eingabe in einen char* bekommst.

    Keine Ahnung, du musst deiner Konsole gar keine Parameter mitgeben.

    ----------

    ---Theorie 2: Du willst ein bestehendes Programm öffnen:

    Also mit WinExec() kannst du das Programm ausführen.

    Keine Ahnung wie du den Text bekommst 🙄.

    Bei WinExec() kannst du auch die Parameter angeben.

    ----------

    MfG SideWinder



  • Mit Pipes gehts, hatte mir mal irgendwann ne Funktion dafür gebastelt:

    // int cmd(char *cmd, char *output, DWORD maxbuffer);
    // cmd 
    //   Datei, die ausgeführt werden soll, am Besten mit
    //   komplettem Pfad
    // output
    //   Zeiger zum Speicher für den Text, die von derr 
    //   Anwendung ausgegeben wird
    // maxbuffer
    //   Wieviele Bytes maximal in den Output-Buffer passen
    
    int cmd(char *cmd, char *output, DWORD maxbuffer)
    {
        HANDLE readHandle;
        HANDLE writeHandle;
        HANDLE stdHandle;
        DWORD bytesRead;
        DWORD retCode;
        SECURITY_ATTRIBUTES sa;
        PROCESS_INFORMATION pi; 
        STARTUPINFO si;
    
        ZeroMemory(&sa,sizeof(SECURITY_ATTRIBUTES));
        ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
        ZeroMemory(&si,sizeof(STARTUPINFO));
    
        sa.bInheritHandle=true;
        sa.lpSecurityDescriptor=NULL;
        sa.nLength=sizeof(SECURITY_ATTRIBUTES);
        si.cb=sizeof(STARTUPINFO);
        si.dwFlags=STARTF_USESHOWWINDOW;
        si.wShowWindow=SW_HIDE;
    
        if (!CreatePipe(&readHandle,&writeHandle,&sa,NULL))
        {
            OutputDebugString("cmd: CreatePipe failed!\n");
            return 0;
        }
    
        stdHandle=GetStdHandle(STD_OUTPUT_HANDLE);
    
        if (!SetStdHandle(STD_OUTPUT_HANDLE,writeHandle))
        {
            OutputDebugString("cmd: SetStdHandle(writeHandle) failed!\n");
            return 0;
        }
    
        if (!CreateProcess(NULL,cmd,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi))
        {
            OutputDebugString("cmd: CreateProcess failed!\n");
            return 0;
        }
    
        GetExitCodeProcess(pi.hProcess,&retCode);
        while (retCode==STILL_ACTIVE)
        {
            GetExitCodeProcess(pi.hProcess,&retCode);
        }
    
        if (!ReadFile(readHandle,output,maxbuffer,&bytesRead,NULL))
        {
            OutputDebugString("cmd: ReadFile failed!\n");
            return 0;
        }
        output[bytesRead]='\0';
    
        if (!SetStdHandle(STD_OUTPUT_HANDLE,stdHandle))
        {
            OutputDebugString("cmd: SetStdHandle(stdHandle) failed!\n");
            return 0;
        }
    
        if (!CloseHandle(readHandle))
        {
            OutputDebugString("cmd: CloseHandle(readHandle) failed!\n");
        }
        if (!CloseHandle(writeHandle))
        {
            OutputDebugString("cmd: CloseHandle(writeHandle) failed!\n");
        }
    
        return 1;
    }
    


  • @geeky: Habe deine Funktion mal ausprobiert. Irgendwie funktioniert das ganze nur, wenn das Programm eine Konsolenanwendung ist, ist es eine Fensteranwendung bleibt er in der Funktion hängen. Also folgendes funktioniert bei mir nicht (Windows XP):

    #include <windows.h>
    
    int cmd(char *cmd, char *output, DWORD maxbuffer)
    {
        HANDLE readHandle;
        HANDLE writeHandle;
        HANDLE stdHandle;
        DWORD bytesRead;
        DWORD retCode;
        SECURITY_ATTRIBUTES sa;
        PROCESS_INFORMATION pi; 
        STARTUPINFO si;
    
        ZeroMemory(&sa,sizeof(SECURITY_ATTRIBUTES));
        ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
        ZeroMemory(&si,sizeof(STARTUPINFO));
    
        sa.bInheritHandle=true;
        sa.lpSecurityDescriptor=NULL;
        sa.nLength=sizeof(SECURITY_ATTRIBUTES);
        si.cb=sizeof(STARTUPINFO);
        si.dwFlags=STARTF_USESHOWWINDOW;
        si.wShowWindow=SW_HIDE;
    
        if (!CreatePipe(&readHandle,&writeHandle,&sa,NULL))
        {
            OutputDebugString("cmd: CreatePipe failed!\n");
            return 0;
        }
    
        stdHandle=GetStdHandle(STD_OUTPUT_HANDLE);
    
        if (!SetStdHandle(STD_OUTPUT_HANDLE,writeHandle))
        {
            OutputDebugString("cmd: SetStdHandle(writeHandle) failed!\n");
            return 0;
        }
    
        if (!CreateProcess(NULL,cmd,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi))
        {
            OutputDebugString("cmd: CreateProcess failed!\n");
            return 0;
        }
    
        GetExitCodeProcess(pi.hProcess,&retCode);
        while (retCode==STILL_ACTIVE)
        {
            GetExitCodeProcess(pi.hProcess,&retCode);
        }
    
        if (!ReadFile(readHandle,output,maxbuffer,&bytesRead,NULL))
        {
            OutputDebugString("cmd: ReadFile failed!\n");
            return 0;
        }
        output[bytesRead]='\0';
    
        if (!SetStdHandle(STD_OUTPUT_HANDLE,stdHandle))
        {
            OutputDebugString("cmd: SetStdHandle(stdHandle) failed!\n");
            return 0;
        }
    
        if (!CloseHandle(readHandle))
        {
            OutputDebugString("cmd: CloseHandle(readHandle) failed!\n");
        }
        if (!CloseHandle(writeHandle))
        {
            OutputDebugString("cmd: CloseHandle(writeHandle) failed!\n");
        }
    
        return 1;
    }
    
    int WINAPI WinMain(HINSTANCE hInstanceHandle,
                       HINSTANCE hPreviousInstanceHandle,
                       LPSTR lpszCommandLine,
                       INT nShowState) {
    
        char PingOutput[2048];
        cmd("ping", PingOutput, 2048);
        MessageBox(NULL, PingOutput, "Ping-Output", MB_OK);
        return EXIT_SUCCESS;
    }
    


  • Bei mir klappt das (Win98), vielleicht muss man bei Win2k/XP noch was bei der SECURITY_ATTRIBUTES-Struktur machen...
    ...oder ich hab da irgendwo was falsch gemacht.

    Änder mal SW_HIDE in SW_SHOWNORMAL - vielleicht hat er schon Probleme ping zu finden (steht nix im Debug-Fenster ?)



  • Ok, hab's jetzt mal mit SW_SHOWNORMAL ausprobiert. Man sieht ganz kurz die Ausgabe von ping. Soweit so gut, aber dannach bleibt er bei ReadFile hängen. Es schlägt nicht fehl, aber die Funktion wird nicht verlassen.
    Ich kann mir nicht vorstellen, das da irgendwelche Security Attributes gesetzt werden müssen, denn als Konsolenanwendung funktioniert das ganze ja.
    Ich habe es übrigens auch mit der POSIX-Funktion popen getestet (_popen unter VC++). Damit funktioniert es auch nicht bei einer Fensteranwendung. 😞



  • Hmm, das Problem mit ReadFile hatte schonmal irgendwer mit der Funktion, wenn ich jetzt noch wüsste ob und wie dass Problem gelöst wurde...



  • Hmm, nach Jahren mal wieder hier reingeguckt und nu frage ich mich, was ReadFile bei Fensteranwendungen auch liefern sollte 😃



  • Ich wollte ja nicht die Ausgaben einer Fensteranwendung auslesen, sondern aus einer Fensteranwendung heraus, ein Konsolenprogramm. 😉

    Aber das Problem hatte sich schon erledigt:
    Probleme mit Pipes



  • axo 😃


Anmelden zum Antworten