Delphi下调用CMD命令并获取结果

procedure CheckResult(b: Boolean); 
begin 
if not b then 
raise Exception.Create(SysErrorMessage(GetLastError)); 
end; 


function RunDOS(const CommandLine: string): 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 or STARTF_USESHOWWINDOW; 
StartInfo.hStdError := HWrite; 
StartInfo.hStdInput := GetStdHandle(STD_INPUT_HANDLE); //HRead; 
StartInfo.hStdOutput := HWrite; 


b := CreateProcess(nil, //lpApplicationName: PChar 
PChar(CommandLine), //lpCommandLine: PChar 
nil, //lpProcessAttributes: PSecurityAttributes 
nil, //lpThreadAttributes: PSecurityAttributes 
True, //bInheritHandles: BOOL 
CREATE_NEW_CONSOLE, 
nil, 
nil, 
StartInfo, 
ProceInfo); 


CheckResult(b); 
WaitForSingleObject(ProceInfo.hProcess, INFINITE); 


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;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值