Results 1 to 3 of 3

Thread: Uitvoer van een DOS programma in een string

  1. #1
    Senior Member PsychoMark's Avatar
    Join Date
    Nov 2001
    Location
    Raamsdonksveer
    Posts
    10,269

    Uitvoer van een DOS programma in een string

    Omschrijving

    Deze functie voert een DOS programma uit (of beter/officiëler gezegd: een console applicatie ) en geeft de output van dit programma als string terug.


    Opmerkingen

    http://www.nldelphi.com/Forum/showth...?threadid=4318

    De functie is enigzins aangepast. Onnodige code is verwijderd, en StdError wordt ook in de gaten gehouden, aangezien sommige programma's daar naar schrijven (heb hier praktijkervaring mee, kon met de originele code de output van sommige C programma's niet capturen, eigenwijze grmbl programma's).



    Code


    Code:
    function CaptureConsoleOutput(const ACommand: String): String;
    const
      CReadBuffer = 2400;
    
    var
      saSecurity:           TSecurityAttributes;
      hRead:                THandle;
      hWrite:               THandle;
      suiStartup:           TStartupInfo;
      piProcess:            TProcessInformation;
      pBuffer:              array[0..CReadBuffer] of Char;
      dRead:                DWord;
      dRunning:             DWord;
    
    begin
      Result  := '';
    
      with saSecurity do begin
        nLength               := SizeOf(TSecurityAttributes);
        bInheritHandle        := True;
        lpSecurityDescriptor  := nil;
      end;
    
      if CreatePipe(hRead, hWrite, @saSecurity, 0) then begin
        FillChar(suiStartup, SizeOf(TStartupInfo), #0);
    
        with suiStartup do begin
          cb            := SizeOf(TStartupInfo);
          hStdInput     := hRead;
          hStdOutput    := hWrite;
          hStdError     := hWrite;
          dwFlags       := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
          wShowWindow   := SW_HIDE;
    
          if CreateProcess(nil, PChar(ACommand), @saSecurity, @saSecurity, True,
                           NORMAL_PRIORITY_CLASS, nil, nil, suiStartup,
                           piProcess) then begin
            repeat
              dRunning  := WaitForSingleObject(piProcess.hProcess, 100);
              Application.ProcessMessages();
    
              repeat
                dRead           := 0;
                ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, nil);
                pBuffer[dRead]  := #0;
    
                OemToAnsi(pBuffer, pBuffer);
                Result  := Result + String(pBuffer);
              until (dRead < CReadBuffer);
            until (dRunning <> WAIT_TIMEOUT);
    
            CloseHandle(piProcess.hProcess);
            CloseHandle(piProcess.hThread);
          end;
    
          CloseHandle(hRead);
          CloseHandle(hWrite);
        end;
      end;
    end;
    
    Last edited by PsychoMark; 05-Sep-03 at 13:58.
    Qui custodiet ipsos custodes

  2. #2
    Senior Member PsychoMark's Avatar
    Join Date
    Nov 2001
    Location
    Raamsdonksveer
    Posts
    10,269
    Kleine update: de read-loop wordt nu uitgevoerd tijdens het wachten. Voor console applicaties kan je de Application.ProcessMessages ertussenuit halen...

    De reden: ik had een console applicatie die flink wat gegevens als uitvoer gaf (CVS), en de originele code bleef hangen. Blijkbaar raakte de buffer op dat moment vol en wachtte CVS/Windows totdat er gegevens uit werden gelezen. De nieuwe code controleert constant of er gegevens in de buffer staan en leest deze uit, waarmee het probleem opgelost is...
    Qui custodiet ipsos custodes

  3. #3
    Senior Member PsychoMark's Avatar
    Join Date
    Nov 2001
    Location
    Raamsdonksveer
    Posts
    10,269
    Zie ook NLDExecute, met een extra bugfix...
    Qui custodiet ipsos custodes

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. CTTM 2003
    By Marcel in forum Koffiehoek
    Replies: 26
    Last Post: 02-Jun-03, 13:02

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •