执行控制台程序并且获得它的输出结果

王朝厨房·作者佚名  2007-01-04
窄屏简体版  字體: |||超大  

摘要:执行控制台程序并且获得它的输出结果

前几日遇到的问题在各位的帮助下已经圆满解决,现在吧这段代码写出来,可能会有一点用处。

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);

Result := sRet.Text;

sRet.Free;

end;

inS.Free;

CloseHandle(HRead);

CloseHandle(HWrite);

end;

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航