2012-06-05 339 views
5

在我的Inno Setup腳本中,我正在執行第三方可執行文件。我使用如下的Exec()功能:Inno Setup Exec()函數等待有限時間

Exec(ExpandConstant('{app}\SomeExe.exe'), '', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode); 

通過提ewWaitUntilTerminated這裏等到SomeExe.exe不退出。我只想等10秒。

有沒有解決方案?

+0

,哪些是你會是10秒後做什麼? – TLama

+0

也許他想殺死這個過程?我想你可以正常執行並創建簡單的定時器,在10秒後殺死進程。 – Slappy

+0

@Slappy,你可以使用例如['Sleep'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms686298%28v=vs.85%29.aspx)函數,然後終止進程。問題是你不知道什麼過程,並且據我所知,從可用的InnoSetup函數中,沒有人返回執行進程句柄,這是進程終止所需的。而如果你想知道進程句柄,這是更好地使用['WaitForSingleObject'(http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032%28v=vs.85%29。 aspx)函數等待。請參閱下面的代碼示例。 – TLama

回答

7

假設你想執行外部應用程序,等待其終止在指定的時間,如果它不是由本身的設置殺死它終止試試下面的代碼。到這裏使用的魔法常量,3000用作WaitForSingleObject函數的參數是設置多長時間等待進程終止以毫秒爲單位的時間。如果它不能在那個時候自行終止,它是由TerminateProcess功能,其中666值是進程退出代碼(在這種情況下,很邪惡:-)

[Code] 
#IFDEF UNICODE 
    #DEFINE AW "W" 
#ELSE 
    #DEFINE AW "A" 
#ENDIF 

const 
    WAIT_TIMEOUT = $00000102; 
    SEE_MASK_NOCLOSEPROCESS = $00000040; 

type 
    TShellExecuteInfo = record 
    cbSize: DWORD; 
    fMask: Cardinal; 
    Wnd: HWND; 
    lpVerb: string; 
    lpFile: string; 
    lpParameters: string; 
    lpDirectory: string; 
    nShow: Integer; 
    hInstApp: THandle;  
    lpIDList: DWORD; 
    lpClass: string; 
    hkeyClass: THandle; 
    dwHotKey: DWORD; 
    hMonitor: THandle; 
    hProcess: THandle; 
    end; 

function ShellExecuteEx(var lpExecInfo: TShellExecuteInfo): BOOL; 
    external 'ShellExecuteEx{#AW}@shell32.dll stdcall'; 
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; 
    external '[email protected] stdcall'; 
function TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL; 
    external '[email protected] stdcall'; 

function NextButtonClick(CurPageID: Integer): Boolean; 
var 
    ExecInfo: TShellExecuteInfo; 
begin 
    Result := True; 

    if CurPageID = wpWelcome then 
    begin 
    ExecInfo.cbSize := SizeOf(ExecInfo); 
    ExecInfo.fMask := SEE_MASK_NOCLOSEPROCESS; 
    ExecInfo.Wnd := 0; 
    ExecInfo.lpFile := 'calc.exe'; 
    ExecInfo.nShow := SW_HIDE; 

    if ShellExecuteEx(ExecInfo) then 
    begin 
     if WaitForSingleObject(ExecInfo.hProcess, 3000) = WAIT_TIMEOUT then 
     begin 
     TerminateProcess(ExecInfo.hProcess, 666); 
     MsgBox('You just killed a little kitty!', mbError, MB_OK); 
     end 
     else 
     MsgBox('The process was terminated in time!', mbInformation, MB_OK); 
    end; 
    end; 
end; 

我有代碼喪生在Windows 7 Inno Setup的5.4.3 Unicode和ANSI版本測試(感謝kobik他的主意,使用條件規定了從this post Windows API函數的聲明)

+0

這是一個不錯的解決方案! – GTAVLover