Ausgabe DOS-Programm auslesen ...
spacer
Autor Nachricht
sp00cky
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Do 05.01.12 18:18 
Moderiert von user profile iconNarses: Abgetrennt von hier

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 markieren
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: String; var 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, 0) then
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, 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);
//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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15833
Erhaltene Danke: 737

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, 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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home