Autor Beitrag
sp00cky
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Do 05.01.12 18:18 
Moderiert von user profile iconNarses: Abgetrennt von [url=www.delphi-forum.de/...28#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: thundaxsoftware.blog...put-with-delphi.html
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.