function TForm1.RunCaptured(
const _dirName, _exeName, _cmdLine:
string): Boolean;
var
start: TStartupInfo;
procInfo: TProcessInformation;
tmpName:
string;
tmp: Windows.THandle;
tmpSec: TSecurityAttributes;
res: TStringList;
return: Cardinal;
begin
Result := False;
try
{ Setze ein Temporäres File }
tmpName := '
Test.tmp';
FillChar(tmpSec, SizeOf(tmpSec), #0);
tmpSec.nLength := SizeOf(tmpSec);
tmpSec.bInheritHandle := True;
tmp := Windows.CreateFile(PChar(tmpName),
Generic_Write, File_Share_Write,
@tmpSec, Create_Always, File_Attribute_Normal, 0);
try
FillChar(start, SizeOf(start), #0);
start.cb := SizeOf(start);
start.hStdOutput := tmp;
start.dwFlags := StartF_UseStdHandles
or StartF_UseShowWindow;
start.wShowWindow := SW_Minimize;
{ bsp. RunCaptured('C:\', 'cmd.exe', '/c dir /?'); }
if CreateProcess
(
nil,
// pointer to name of executable module
PChar(_exeName+'
'+_cmdLine),
// pointer to command line string
nil,
// pointer to process security attributes
nil,
// pointer to thread security attributes
True,
// handle inheritance flag
0,
// creation flags
nil,
// pointer to new environment block
PChar(_dirName),
// pointer to current directory name
start,
// pointer to STARTUPINFO
procInfo)
// pointer to PROCESS_INFORMATION
then
begin
SetPriorityClass(procInfo.hProcess, Idle_Priority_Class);
WaitForSingleObject(procInfo.hProcess, Infinite);
GetExitCodeProcess(procInfo.hProcess, return);
Result := (return = 0);
CloseHandle(procInfo.hThread);
CloseHandle(procInfo.hProcess);
Windows.CloseHandle(tmp);
{ Die Ausgaben hinzufügen }
res := TStringList.Create;
try
res.LoadFromFile(tmpName);
Memo1.Lines.AddStrings(res);
finally
res.Free;
end;
Windows.DeleteFile(PChar(tmpName));
end
else
begin
Application.MessageBox(PChar(SysErrorMessage(GetLastError())),
'
RunCaptured Error', MB_OK);
end;
except
Windows.CloseHandle(tmp);
Windows.DeleteFile(PChar(tmpName));
raise;
end;
finally
end;
end;