본문 바로가기
Delphi, RadStudio

[개발/delphi] 외부 프로그램 실행하고 기다리기 Execute and wait

by SB리치퍼슨 2011. 12. 12.
[delphi] Execute and wait for termination (16 and 32bit applications)

http://www.delphifaq.com/faq/delphi_windows_API/f353_0.htm

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.
 

반응형

댓글