Pipes?



  • Hi!
    Ich möchte ein innerhalb meines Programmes ein Konsolenprogramm starten, und dann dessen Ausgabe "entgegennehmen". Ich möchte dabei jedoch nicht auf die Umleitung auf Dateien zurückgreifen? Welche Möglichkeiten gibt es noch? Ich hab etwas von Pipes gehört, sind diese dazu geeignet?

    lg, phreaking





  • Danke!

    lg, phreaking

    [ Dieser Beitrag wurde am 05.06.2002 um 06:57 Uhr von phreaking editiert. ]



  • Hmm... ich habe ein kleines Beispiel geschrieben. Das ausgeführte Programm gibt ständig etwas aus, leider liefert ReadFile in num 0. GetLastError liefert 5 (Access denied). Wo liegt hier also der Fehler:

    void Pipe(char *cmd)
    {
     HANDLE handleStdOutput, handleOutput /* lesen */;
     HANDLE handleStdInput, handleInput /* schreiben */;
     HANDLE handleStdError, handleError /* lesen */;
     STARTUPINFO si={0};
     SECURITY_ATTRIBUTES sa;
     PROCESS_INFORMATION pi;
     DWORD num=0;
    
     sa.bInheritHandle=true;
     sa.lpSecurityDescriptor=NULL;
     sa.nLength=sizeof(SECURITY_ATTRIBUTES); 
     CreatePipe(&handleStdOutput, &handleOutput, &sa, 10);
     CreatePipe(&handleInput, &handleStdInput, &sa, 10);
     CreatePipe(&handleStdError, &handleError, &sa, 10);
     strcpy(cmd, "C:\\a.exe");
     si.cb=sizeof(STARTUPINFO);
     si.dwFlags=STARTF_USESTDHANDLES; // STARTF_USESHOWWINDOW|
     // si.wShowWindow=SW_RESTORE;//SW_HIDE;
     si.hStdInput=handleStdInput;
     si.hStdOutput=handleStdOutput;
     si.hStdError=handleStdError;
     CreateProcess(NULL, cmd, NULL, NULL, false, 0, NULL, NULL, &si, &pi);
     do
      ReadFile(handleOutput, cmd, 5, &num, 0);
     while(!num);
    }
    

    lg, phreaking

    [ Dieser Beitrag wurde am 05.06.2002 um 17:45 Uhr von phreaking editiert. ]



  • Da ich gerade wenig Zeit hab, poste ich einfach mal ein komplettes Beispiel-Programm:

    // un_pipe.cpp : Defines the entry point for the application.
    //
    
    #include "stdafx.h"
    
    int cmd(char *cmd, char *output, DWORD maxbuffer);
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
        char output[50000];
    
        cmd("ping t-online.de",output, 50000);
    
        MessageBox(0,output,"lol",0);
    
        return 0;
    }
    
    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;
    }
    


  • Danke! Ich weiß nun, warum mein Code nicht funktioniert. Ich habe ihn innerhalb einer MFC-Anwendung verwendet. Dein Code funktioniert innerhalb meiner MFC-Anwendung leider auch nicht. Wie kann ich aber innerhalb einer MFC-Anwendung Pipes zum Laufen bekommen (außer mit AttachConsole, ich habe nämlich nicht WinXP 😉 )?

    lg, phreaking



  • Danke, das Problem hat sich soeben erledigt... 😃

    so long, phreaking

    [ Dieser Beitrag wurde am 08.06.2002 um 10:44 Uhr von phreaking editiert. ]



  • Original erstellt von phreaking:
    Danke, das Problem hat sich soeben erledigt... 😃

    Ich steh im Moment irgendwie vorm selben Problem aber raffs ned. Weder der Code hier, noch der in der Knowledgebase lässt sich in meiner MFC-Anwendung verwenden. Haste mir mal n Tip was ich vergessen habe?

    -junix


Anmelden zum Antworten