200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > Delphi通过管道执行外部命令行程序(cmd)并获取返回结果

Delphi通过管道执行外部命令行程序(cmd)并获取返回结果

时间:2021-11-03 05:03:57

相关推荐

Delphi通过管道执行外部命令行程序(cmd)并获取返回结果

该代码片段来自于: /codes/delphi/8999,发现好多代码,想用的时候找不到,记录一下备用

function RunDosCommand(Command: string): string;

var

hReadPipe: THandle;

hWritePipe: THandle;

SI: TStartUpInfo;

PI: TProcessInformation;

SA: TSecurityAttributes;

// SD : TSecurityDescriptor;

BytesRead: DWORD;

Dest: AnsiString;

TmpList: TStringList;

Avail, ExitCode, wrResult: DWORD;

osVer: TOSVERSIONINFO;

tmpstr: AnsiString;

begin

SetLength(Dest, 1024);

osVer.dwOSVersionInfoSize := Sizeof(TOSVERSIONINFO);

GetVersionEX(osVer);

if osVer.dwPlatformId = VER_PLATFORM_WIN32_NT then

begin

// InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION);

// SetSecurityDescriptorDacl(@SD, True, nil, False);

SA.nLength := SizeOf(SA);

SA.lpSecurityDescriptor := nil; //@SD;

SA.bInheritHandle := True;

CreatePipe(hReadPipe, hWritePipe, @SA, 0);

end

else

CreatePipe(hReadPipe, hWritePipe, nil, 1024);

try

FillChar(SI, SizeOf(SI), 0);

SI.cb := SizeOf(TStartUpInfo);

SI.wShowWindow := SW_HIDE;

SI.dwFlags := STARTF_USESHOWWINDOW;

SI.dwFlags := SI.dwFlags or STARTF_USESTDHANDLES;

SI.hStdOutput := hWritePipe;

SI.hStdError := hWritePipe;

if CreateProcess(nil, PChar(@Command[1]), nil, nil, True, NORMAL_PRIORITY_CLASS, nil, nil, SI, PI) then

begin

ExitCode := 0;

while ExitCode = 0 do

begin

wrResult := WaitForSingleObject(PI.hProcess, 500);

// if PeekNamedPipe(hReadPipe, nil, 0, nil, @Avail, nil) then

if PeekNamedPipe(hReadPipe, @Dest[1], 1024, @Avail, nil, nil) then

begin

if Avail > 0 then

begin

TmpList := TStringList.Create;

try

FillChar(Dest[1], Length(Dest) * SizeOf(Char), 0);

ReadFile(hReadPipe, Dest[1], Avail, BytesRead, nil);

TmpStr := Copy(Dest, 0, BytesRead - 1);

TmpList.Text := TmpStr;

Result := tmpstr;

finally

TmpList.Free;

end;

end;

end;

if wrResult <> WAIT_TIMEOUT then ExitCode := 1;

end;

GetExitCodeProcess(PI.hProcess, ExitCode);

CloseHandle(PI.hProcess);

CloseHandle(PI.hThread);

end;

finally

CloseHandle(hReadPipe);

CloseHandle(hWritePipe);

end;

end;//该代码片段来自于: /codes/delphi/8999, 并进行了适当的修改

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。