Entwickler-Ecke

Dateizugriff - Ausgabe DOS-Programm auslesen ...


sp00cky - Do 05.01.12 18:18

Moderiert von user profile iconNarses: Abgetrennt von [url=http://www.delphi-forum.de/viewtopic.php?p=629628#629628]hier[/url]

Hab laaaaaaaaaaaange nach was gesucht da es unter Delphi XE nur errors ausgibt!


Hier die Lösung für Delphi XE

vorlage von: http://thundaxsoftware.blogspot.com/2011/07/capturing-console-output-with-delphi.html

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
procedure CaptureConsoleOutput(const ACommand, AParameters: Stringvar ouput:TStringlist);
const
    CReadBuffer = 2400;
var
    saSecurity: TSecurityAttributes;
    hRead: THandle;
    hWrite: THandle;
    suiStartup: TStartupInfo;
    piProcess: TProcessInformation;
    pBuffer: array [0 .. CReadBuffer] of AnsiChar;
    dBuffer: array [0 .. CReadBuffer] of AnsiChar;
    dRead: DWord;
    dRunning: DWord;
    Stream: TMemoryStream;
begin
Stream:= TMemoryStream.Create;
    saSecurity.nLength := SizeOf(TSecurityAttributes);
    saSecurity.bInheritHandle := True;
    saSecurity.lpSecurityDescriptor := nil;

    if CreatePipe(hRead, hWrite, @saSecurity, 0then
    begin
        FillChar(suiStartup, SizeOf(TStartupInfo), #0);
        suiStartup.cb := SizeOf(TStartupInfo);
        suiStartup.hStdInput := hRead;
        suiStartup.hStdOutput := hWrite;
        suiStartup.hStdError := hWrite;
        suiStartup.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
        suiStartup.wShowWindow := SW_HIDE;

        if CreateProcess(nil, pChar(ACommand + ' ' + AParameters), @saSecurity, @saSecurity, True, NORMAL_PRIORITY_CLASS, nilnil, 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);
                    //Unicode support by Lars Fosdal
                    OemToCharA(pBuffer, dBuffer);
                   Stream.Write(pBuffer, dRead);
                until (dRead < CReadBuffer);
            until (dRunning <> WAIT_TIMEOUT);
            CloseHandle(piProcess.hProcess);
            CloseHandle(piProcess.hThread);
        end;
        stream.Position:=0;
  ouput.LoadFromStream(Stream);
  Stream.Free;
        CloseHandle(hRead);
        CloseHandle(hWrite);
    end;
end;

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


jaenicke - Do 05.01.12 19:12

Hallo und :welcome: im Forum

Es ist schön, dass du helfen möchtest, aber der Thread ist schon etwas älter, da macht es nicht so viel Sinn den nochmal hervorzukramen. ;-)

In diesem Fall passt die Lösung auch nicht. Genau dieser Weg funktioniert durch die Neupositionierung des Mauszeigers nicht, siehe Diskussion.

Dann noch als Hinweis:
Der Code so nicht so gut geschrieben. Schon alleine dass ouput als var Parameter übergeben wird... und dann noch als TStringList statt TStrings.
Umlaute werden nicht korrekt umgewandelt.
Für stream fehlt der Ressourcenschutzblock.
usw.