Registriert seit: 7. Jan 2003
Ort: Menden
192 Beiträge
Delphi 7 Enterprise
|
Re: Konsole nachproggen - kleine Schwierigkeiten
4. Sep 2004, 04:50
Ich hab da hier im Forum irgendwo mal diese Function gefunden,
vielleicht hilft dir das weiter :
Delphi-Quellcode:
procedure TEditForm.CaptureDosCmd(command, Params:String; var OutputMemo:TStringList);
const
CaptureBufferSize = 4096;
var
SecAttrib : TSecurityAttributes;
ReadPipe,writePipe : THandle;
Startup : TStartUpInfo;
ProcessInfo : TProcessInformation;
CaptureBuffer : Pchar;
BytesRead : DWord;
WaitHandle : DWord;
CurSize : Cardinal;
procedure GetBuffer;
begin
Repeat
BytesRead := 0;
ReadFile(ReadPipe,CaptureBuffer[0],CaptureBufferSize,BytesRead,nil);
CaptureBuffer[BytesRead]:= #0;
OemToAnsi(CaptureBuffer,CaptureBuffer);
OutputMemo.Text := OutputMemo.Text+String(CaptureBuffer);
until (BytesRead < CaptureBufferSize);
end;
begin
OutPutMemo.clear;
// OutputMemo.add('# Starte "'+command+'"');
With SecAttrib do begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
if Createpipe (ReadPipe, writePipe, @SecAttrib, 0) then begin
CaptureBuffer := AllocMem(CaptureBufferSize + 1);
FillChar(Startup,Sizeof(Startup),#0);
Startup.cb := SizeOf(Startup);
Startup.hStdOutput := writePipe;
Startup.hStdInput := ReadPipe;
Startup.dwFlags := STARTF_USESTDHANDLES +
STARTF_USESHOWWINDOW;
Startup.wShowWindow := SW_HIDE;
// Startup.wShowWindow := SW_NORMAL;
if CreateProcess(PChar(command), PChar(params), @SecAttrib, @SecAttrib, true, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, Startup, ProcessInfo) then begin
repeat
WaitHandle := WaitForSingleObject( ProcessInfo.hProcess,0);
CurSize := FileSeek(ReadPipe,0,2);
If (CurSize >= 4096) then // Puffer in Memo ausgeben und damit leeren
GetBuffer;
Application.ProcessMessages;
until (WaitHandle = WAIT_OBJECT_0) or (WaitHandle = WAIT_FAILED) or application.terminated;
if not application.terminated then begin
CurSize := FileSeek(ReadPipe,0,2);
If (CurSize > 0 ) then // Falls Rest im Puffer, in Memo ausgeben
GetBuffer;
end
else
OutPutMemo.add('# Operation canceled!');
FreeMem(CaptureBuffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(writePipe);
end
else
OutPutMemo.add('# cannot create process. Error: #'+inttostr(getlasterror));
end
else
OutPutMemo.add('# cannot create pipe. Error: #'+inttostr(getlasterror));
end;
Christian Killing for peace is like fucking for virginity
Nightshade
|
|
Zitat
|