Title: How do I execute another program from my Delphi application 2
This function encapslates the API Functions CreateProcess and WaitForSingleObject, createprocess effectivly starts the new process (program) in a new thread so the calling program can continue to run concurrently.
The timeout value can be used to force the process to terminate.
CODE
{ Useage: Filename, The file to be executed
Params, Any parameters that require passing to the file
Timeout, Time to wait in mS. Pass the constant INFINITE to wait forever
Visibility, Run window status e.g SW_SHOW, SW_MAXIMIZE
It returns a string containing the last error if any
}
function WaitProcess(Filename: TFilename; Params: string;
Timeout: DWORD; Visibility: integer): string;
var StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
WaitResult: integer;
begin
ZeroMemory(@StartupInfo, SizeOf(TStartupInfo));
with StartupInfo do
begin
cb := SizeOf(TStartupInfo);
dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
wShowWindow := Visibility;
end;
if fileexists(filename) or fileexists(params) then
begin
if (CreateProcess(nil, Pchar(Filename +' '+ Params), Nil, Nil,
False, NORMAL_PRIORITY_CLASS,
Nil, nil { pchar(extractfilepath(Params))}, StartupInfo, ProcessInfo))
then
begin
WaitResult := WaitForSingleObject(ProcessInfo.hProcess, Timeout);
if WaitResult = WAIT_TIMEOUT then
begin
result := 'Timeout has occured in waiting for result from compiler.';
TerminateProcess(ProcessInfo.hprocess, 1);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
exit;
end;
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
Result := 'OK';
end
else
result := 'Create Proccess failed ' + filename + ' '+ Params+ ' Error: '+inttostr(getlasterror);
end
else
result := 'Process file does not exist';
end;