执行命令并从与控制台进行交互
来源:互联网 发布:sql 2000下载 编辑:程序博客网 时间:2024/05/16 16:21
unit uConsole;
interface
uses windows;
type
TOnData = procedure(Sender: TObject; Data: String) of object;
TOnRun = procedure(Sender: TObject) of object;
TRedirectedConsole = Class(TObject)
private
fStdInRead, fStdInWrite: THandle;
fStdOutRead, fStdOutWrite: THandle;
fStdErrRead, fStdErrWrite: THandle;
fSA: TSecurityAttributes;
fPI: TProcessInformation;
fSI: TStartupInfo;
fCmdLine: String;
fOnStdOut, fOnStdErr: TOnData;
fOnRun, fOnEnd: TOnRun;
fIsRunning: Boolean;
fHidden: boolean;
fTerminate: boolean;
function ReadHandle(h: THandle; var s: string): integer;
protected
public
constructor Create(CommandLine: String);
destructor Destroy; override;
procedure Run;
procedure SendData(s: String);
property OnStdOut: TOnData read fOnStdOut write fOnStdOut;
property OnStdErr: TOnData read fOnStdErr write fOnStdErr;
property OnRun: TOnRun read fOnRun write fOnRun;
property OnEnd: TOnRun read fOnEnd write fOnEnd;
property IsRunning: boolean read fIsRunning;
property HideWindow: boolean read fHidden write fHidden;
end;
implementation
const BufSize = 1024;
constructor TRedirectedConsole.Create(CommandLine: String);
begin
inherited Create;
fCmdLine := CommandLine;
fIsRunning := False;
fHidden := True;
FillChar(fSA, SizeOf(fSA), 0);
fSA.nLength := SizeOf(fSA);
fSA.lpSecurityDescriptor := nil;
fSA.bInheritHandle := True;
CreatePipe(fStdInRead, fStdInWrite, @fSA, BufSize);
CreatePipe(fStdOutRead, fStdOutWrite, @fSA, BufSize);
CreatePipe(fStdErrRead, fStdErrWrite, @fSA, BufSize);
end;
destructor TRedirectedConsole.Destroy;
begin
if fIsRunning then
begin
fTerminate := True;
end;
CloseHandle(fStdInWrite);
CloseHandle(fStdOutRead);
CloseHandle(fStdErrRead);
inherited;
end;
function TRedirectedConsole.ReadHandle(h: THandle; var s: String): integer;
var
BytesWaiting: Cardinal;
Buf: Array[1..BufSize] of char;
{$IFDEF VER100}
BytesRead: Integer;
{$ELSE}
BytesRead: Cardinal;
{$ENDIF}
begin
Result := 0;
PeekNamedPipe(h, nil, 0, nil, @BytesWaiting, nil);
if BytesWaiting > 0 then
begin
if BytesWaiting > BufSize then
BytesWaiting := BufSize;
ReadFile(h, Buf[1], BytesWaiting, BytesRead, nil);
s := Copy(Buf, 1, BytesRead);
Result := BytesRead;
end;
end;
procedure TRedirectedConsole.SendData(s: String);
var
{$IFDEF VER100}
BytesWritten: Integer;
{$ELSE}
BytesWritten: Cardinal;
{$ENDIF}
begin
if fIsRunning then
begin
WriteFile(fStdInWrite, s[1], Length(s), BytesWritten, nil);
end;
end;
procedure TRedirectedConsole.Run;
var
s: String;
begin
fTerminate := False;
FillChar(fSI, SizeOf(fSI), 0);
fSI.cb := SizeOf(fSI);
if fHidden then
fSI.wShowWindow := SW_HIDE
else
fSI.wShowWindow := SW_SHOWDEFAULT;
fSI.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
fSI.hStdInput := fStdInRead;
fSI.hStdOutput := fStdOutWrite;
fSI.hStdError := fStdErrWrite;
if CreateProcess(nil, PChar(fCmdLine), nil, nil, True, NORMAL_PRIORITY_CLASS, nil, nil, fSI, fPI) then
begin
fIsRunning := True;
CloseHandle(fStdOutWrite);
CloseHandle(fStdErrWrite);
CloseHandle(fStdInRead);
CloseHandle(fPI.hThread);
While WaitForSingleObject(fPI.hProcess, 10) = WAIT_TIMEOUT do
begin
if fTerminate then
begin
TerminateProcess(fPi.hProcess, 0);
end;
if ReadHandle(fStdOutRead, s) > 0 then
if Assigned(fOnStdOut) then
fOnStdOut(Self, s);
if ReadHandle(fStdErrRead, s) > 0 then
if Assigned(fOnStdErr) then
fOnStdErr(Self, s);
if Assigned(fOnRun) then
fOnRun(Self);
end;
if ReadHandle(fStdOutRead, s) > 0 then
if Assigned(fOnStdOut) then
fOnStdOut(Self, s);
if ReadHandle(fStdErrRead, s) > 0 then
if Assigned(fOnStdErr) then
fOnStdErr(Self, s);
CloseHandle(fPI.hProcess);
fIsRunning := False;
if Assigned(fOnEnd) then
fOnEnd(Self);
end;
end;
end.
- 执行命令并从与控制台进行交互
- Android模拟器与控制台交互命令
- 使用java.io.console来与控制台设备进行交互
- Jmeter中利用BeanShell Sampler与控制台进行交互
- JAVA从控制台获取输入并进行字符串解析
- c#.NET 调用命令控制台 并获取执行结果
- 从标准输入读命令并执行
- Java语言进行扫描与执行命令
- BeanShell Sample与控制台交互
- JAVA使用JSch进行SSH连接Linux并执行命令
- 读取字符从控制台窗口,然后进行排序_v1_不能执行。
- java调用控制台执行命令
- 1-5 从标准输入读入命令并执行
- 从标准输入中读命令并执行
- 笔记1-3: 从标准输入读取命令并执行
- 1.5 从标准输入读取命令并执行
- APUE 1-7 从标准输入读命令并执行
- APUE 1-10 从标准输入读命令并执行
- WIN_DOS经典大全
- 应用版本控制软件管理软件开发
- JSP上传下载文件问题,求助!
- 表单设计问题,求助!
- checkbox 和radio,谁能指点一下!!!
- 执行命令并从与控制台进行交互
- 分辨率的问题,哪位给解释一下,谢了!
- PFC入门
- These are the characters that can be directly encoded in UTF7...
- 2005年9月20日(月记)
- 求救:怎样获得前一天的日期??
- 今天体验了一把MOBILE!
- VB中的SyncLock
- Grup如何进入单用户模式