Hallo,
kann mir jemand helfen? Ich habe ein Problem mit dem Code: Ich habe
den Code so wie er unten ist eingegeben und der Code geht so:
Man braucht eine Memo-Komponente und einen Button. Wenn man auf den
Button klickt, wird die Eingabeaufforderung von Windows umgeleitet
in das Memofeld. ABER: Es wird in dem Memofeld nicht der Vorgang angezeigt
sondern nur das, wenn es abgeschlossen ist. Z. B. wenn ich bei dem
Button '/c format C:' eingebe, dann steht nichts da. Ich möchte
aber die ganze Eingabeaufforderung in dem Memofeld anzeigen. So dass
ich in das Memofeld wie die Eingabeaufforderung etwas eingeben kann,
oder habt ihr eine andere Idee????
Danke
Tobias
--------------------------------------------------------------------------
procedure CaptureDosCmd(command:String;OutputMemo:TMemo);
const
CaptureBufferSize = 2500;
var
SecAttrib : TSecurityAttributes;
ReadPipe,writePipe: THandle;
Startup : TStartUpInfo;
ProcessInfo : TProcessInformation;
CaptureBuffer : Pchar;
BytesRead : DWord;
WaitHandle : DWord;
begin
OutPutMemo.Lines.clear;
OutputMemo.lines.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;
if CreateProcess(nil,
PChar(command),
@SecAttrib,
@SecAttrib,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
Startup,
ProcessInfo) then
begin
repeat
WaitHandle := WaitForSingleObject( ProcessInfo.hProcess,100);
Application.ProcessMessages;
until (WaitHandle <> WAIT_TIMEOUT) or application.terminated;
if not application.terminated then
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 else OutPutMemo.lines.add('Operation wurde abgebrochen!');
FreeMem(CaptureBuffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(writePipe);
end else OutPutMemo.lines.add('Konnte Kommando nicht starten, Fehler:
#'+
inttostr(getlasterror));
end;
procedure TForm2.FormActivate(Sender: TObject);
var
cmd : array[0..255] of char;
par : array[0..255] of char;
begin
getEnvironmentVariable('COMSPEC', cmd, 255);
// getEnvironmentVariable('WINDIR', par, 255);
par := '';
CaptureDosCmd(cmd + ' /c dir' + par, Memo1);
end;
kann mir jemand helfen? Ich habe ein Problem mit dem Code: Ich habe
den Code so wie er unten ist eingegeben und der Code geht so:
Man braucht eine Memo-Komponente und einen Button. Wenn man auf den
Button klickt, wird die Eingabeaufforderung von Windows umgeleitet
in das Memofeld. ABER: Es wird in dem Memofeld nicht der Vorgang angezeigt
sondern nur das, wenn es abgeschlossen ist. Z. B. wenn ich bei dem
Button '/c format C:' eingebe, dann steht nichts da. Ich möchte
aber die ganze Eingabeaufforderung in dem Memofeld anzeigen. So dass
ich in das Memofeld wie die Eingabeaufforderung etwas eingeben kann,
oder habt ihr eine andere Idee????
Danke
Tobias
--------------------------------------------------------------------------
procedure CaptureDosCmd(command:String;OutputMemo:TMemo);
const
CaptureBufferSize = 2500;
var
SecAttrib : TSecurityAttributes;
ReadPipe,writePipe: THandle;
Startup : TStartUpInfo;
ProcessInfo : TProcessInformation;
CaptureBuffer : Pchar;
BytesRead : DWord;
WaitHandle : DWord;
begin
OutPutMemo.Lines.clear;
OutputMemo.lines.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;
if CreateProcess(nil,
PChar(command),
@SecAttrib,
@SecAttrib,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
Startup,
ProcessInfo) then
begin
repeat
WaitHandle := WaitForSingleObject( ProcessInfo.hProcess,100);
Application.ProcessMessages;
until (WaitHandle <> WAIT_TIMEOUT) or application.terminated;
if not application.terminated then
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 else OutPutMemo.lines.add('Operation wurde abgebrochen!');
FreeMem(CaptureBuffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(writePipe);
end else OutPutMemo.lines.add('Konnte Kommando nicht starten, Fehler:
#'+
inttostr(getlasterror));
end;
procedure TForm2.FormActivate(Sender: TObject);
var
cmd : array[0..255] of char;
par : array[0..255] of char;
begin
getEnvironmentVariable('COMSPEC', cmd, 255);
// getEnvironmentVariable('WINDIR', par, 255);
par := '';
CaptureDosCmd(cmd + ' /c dir' + par, Memo1);
end;