您的位置:首页 > 编程语言 > Delphi

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

2017-10-15 14:45 1171 查看
//================================================================
//K8执行DOS并返回结果
function
RunDosCommand(Command:
string
):
string
;
var
hReadPipe:
THandle;
hWritePipe:
THandle;
SI:
TStartUpInfo;
PI:
TProcessInformation;
SA:
TSecurityAttributes;
//
SD : TSecurityDescriptor;
BytesRead:
DWORD;
Dest:
array
[
0..1023
]
of
char
;
CmdLine:
array
[
0..512
]
of
char
;
TmpList:
TStringList;
Avail,
ExitCode,wrResult: DWORD;
osVer:
TOSVERSIONINFO;
tmpstr:
AnsiString
;
begin
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;
StrPCopy(CmdLine,
Command);
if
CreateProcess(
nil
,
CmdLine,
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[
0
],
1024
,
@Avail,
nil
,
nil
)
then
begin
if
Avail
>
0
then
begin
TmpList
:= TStringList
.
Create;
try
FillChar(Dest,
SizeOf(Dest),
0
);
ReadFile(hReadPipe,
Dest[
0
],
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
;
//该代码片段来自于: http://www.sharejs.com/codes/delphi/8999
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  delphi api dos