如何用Delphi运行DOS命令,把结果显示在MEMO里【转】
(2010-07-30 06:00:08)
标签:
杂谈 |
分类: 临时【程序】 |
前几日遇到的问题在各位的帮助下已经圆满解决,现在吧这段代码写出来,可能会有一点用处。
procedure CheckResult(b:
Boolean);
begin
if not
b then
Raise
Exception.Create(SysErrorMessage(GetLastError));
end;
function RunDOS(const Prog,
CommandLine,Dir: String;var
ExitCode:DWORD):
String;
var
HRead,HWrite:THandle;
StartInfo:TStartupInfo;
ProceInfo:TProcessInformation;
b:Boolean;
sa:TSecurityAttributes;
inS:THandleStream;
sRet:TStrings;
begin
Result :=
' ';
FillChar(sa,sizeof(sa),0);
//设置允许继承,否则在NT和2000下无法取得输出结果
sa.nLength
:= sizeof(sa);
sa.bInheritHandle
:= True;
sa.lpSecurityDescriptor
:= nil;
b :=
CreatePipe(HRead,HWrite,@sa,0);
CheckResult(b);
FillChar(StartInfo,SizeOf(StartInfo),0);
StartInfo.cb
:= SizeOf(StartInfo);
StartInfo.wShowWindow
:= SW_HIDE;
//使用指定的句柄作为标准输入输出的文件句柄,使用指定的显示方式
StartInfo.dwFlags
:=
STARTF_USESTDHANDLES+STARTF_USESHOWWINDOW;
StartInfo.hStdError
:=
HWrite;
StartInfo.hStdInput
:=
GetStdHandle(STD_INPUT_HANDLE);//HRead;
StartInfo.hStdOutput
:=
HWrite;
b :=
CreateProcess(PChar(Prog),//lpApplicationName:
PChar
PChar(CommandLine),
//lpCommandLine:
PChar
nil,
//lpProcessAttributes:
PSecurityAttributes
nil,
//lpThreadAttributes:
PSecurityAttributes
True,
//bInheritHandles: BOOL
CREATE_NEW_CONSOLE,
nil,
PChar(Dir),
StartInfo,
ProceInfo
);
CheckResult(b);
WaitForSingleObject(ProceInfo.hProcess,INFINITE);
GetExitCodeProcess(ProceInfo.hProcess,ExitCode);
inS :=
THandleStream.Create(HRead);
if
inS.Size> 0 then
begin
sRet :=
TStringList.Create;
sRet.LoadFromStream(inS);
procedure
begin
end;
function
var
begin