Mega Code Archive

 
Categories / Delphi / Examples
 

Execute and wait for termination [16 and 32bit applications]

This unit is based upon the well-known and largely used WinExecAndWait function The former WinexecAndWait function doesn't compile under Delphi 2.0 because the GetModuleUsage function is no longer supported under Win95. I have simply updated the previous code so that it works with Delphi 2.0 under Windows 95. With this function you can call Windows-based applications as well as Dos-based commands. That is 'c:\myapp\app32.exe' as well as command.com /c del *.bak'. This new WinexecAndWait32 is intended for Delphi 2.0 Win95 only, it works for me but you use it at your own risk: unit WinExc32; // Author : Francis Parlant. // Update : Bill Rinko-Gay // Parameters: // Path: a null terminated string with the command line // Visibility: Windows SHOW constant such as WS_RESTORE // Timeout: DWORD time in miliseconds or INFINITE to wait forever // // The previous version went into a loop, constantly checking to see // if the exec'ed program had terminated. This version uses the Win95 // API call to WaitForSingleObject to block processing until the // exec'ed program has terminated. The return value will be either // an error code from the CreateProcess function, or the result // of the wait. interface uses Windows; function WinExecAndWait32(Path: PChar; Visibility: Word; Timeout : DWORD): integer; implementation function WinExecAndWait32(Path: PChar; Visibility: Word; Timeout : DWORD): integer; var WaitResult : integer; StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; iResult : integer; begin FillChar(StartupInfo, SizeOf(TStartupInfo), 0); with StartupInfo do begin cb := SizeOf(TStartupInfo); dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK; { you could pass sw_show or sw_hide as parameter: } wShowWindow := visibility; end; if CreateProcess(nil,path,nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then begin WaitResult := WaitForSingleObject(ProcessInfo.hProcess, timeout); { timeout is in miliseconds or INFINITE if you want to wait forever } result := WaitResult; end else { error occurs during CreateProcess see help for details } result:=GetLastError; end; end.