procedure
RunConsoleApplicationTime(CmdLine,Params:
String
;OutStrings:TStrings;TimeOut:DWORD);
var
securityattributes: TSecurityAttributes;
startupinfo: TStartupInfo;
processinformation: TProcessInformation;
hPipeInputRead: THandle;
hPipeInputWrite: THandle;
hPipeOutputRead: THandle;
hPipeOutputWrite: THandle;
WaitResult:
Cardinal
;
AnsiBuf: TAnsiBuf;
CharBuf: TCharBuf;
dummy:
Cardinal
;
s:
string
;
begin
securityattributes
.
nLength:=SizeOf(TSecurityAttributes);
securityattributes
.
lpSecurityDescriptor:=
nil
;
securityattributes
.
bInheritHandle:=
True
;
CreatePipe(hPipeInputRead, hPipeInputWrite, @securityattributes,
0
);
CreatePipe(hPipeOutputRead, hPipeOutputWrite, @securityattributes,
0
);
ZeroMemory(@startupinfo, SizeOf(TStartupInfo));
ZeroMemory(@processinformation, SizeOf(TProcessInformation));
with
startupinfo
do
begin
cb:=SizeOf(TStartupInfo);
dwFlags:=STARTF_USESHOWWINDOW
or
STARTF_USESTDHANDLES;
wShowWindow:=SW_HIDE;
hStdInput:=hPipeInputRead;
hStdOutput:=hPipeOutputWrite;
hStdError:=hPipeOutputWrite;
end
;
OutStrings
.
BeginUpdate;
OutStrings
.
Append(CmdLine+
' '
+Params);
OutStrings
.
EndUpdate;
if
CreateProcess(
nil
,
PChar
(CmdLine+
' '
+Params),
nil
,
nil
,
True
, CREATE_NEW_CONSOLE,
nil
,
PChar
(ExtractFileDir(CmdLine)), startupinfo, processinformation)
then
begin
WaitResult:=WaitForSingleObject(processinformation
.
hProcess, TimeOut);
if
WaitResult=WAIT_TIMEOUT
then
begin
if
ReadFile(hPipeOutputRead, AnsiBuf, Length(AnsiBuf), dummy,
nil
)
then
begin
AnsiBufToCharBuf(AnsiBuf, CharBuf, dummy);
OutStrings
.
BeginUpdate;
OutStrings
.
Text:=OutStrings
.
Text+Copy(CharBuf,
1
, dummy);
if
Pos(#
8
,OutStrings
.
Text)>
0
then
begin
s:=OutStrings
.
Text;
Delete(s,Pos(#
8
,s)-
3
,
4
);
OutStrings
.
Text:=s;
end
;
OutStrings
.
EndUpdate;
end
;
OutStrings
.
Append(
'Выход по таймауту'
);
TerminateProcess(processinformation
.
hProcess,
0
);
Sleep(
10000
);
end
else
begin
if
ReadFile(hPipeOutputRead, AnsiBuf, Length(AnsiBuf), dummy,
nil
)
then
begin
AnsiBufToCharBuf(AnsiBuf, CharBuf, dummy);
OutStrings
.
BeginUpdate;
OutStrings
.
Text:=OutStrings
.
Text+Copy(CharBuf,
1
, dummy);
if
Pos(#
8
,OutStrings
.
Text)>
0
then
begin
s:=OutStrings
.
Text;
Delete(s,Pos(#
8
,s)-
3
,
4
);
OutStrings
.
Text:=s;
end
;
OutStrings
.
EndUpdate;
end
;
end
;
CloseHandle(processinformation
.
hProcess);
end
else
begin
OutStrings
.
BeginUpdate;
OutStrings
.
Append(SysErrorMessage(GetLastError));
OutStrings
.
EndUpdate;
end
;
CloseHandle(hPipeInputWrite);
CloseHandle(hPipeInputRead);
CloseHandle(hPipeOutputWrite);
CloseHandle(hPipeOutputRead);
end
;