2012-06-05 38 views
5

Trong tập lệnh Inno Setup của tôi, tôi đang thực thi thực thi của bên thứ ba. Tôi đang sử dụng Exec() chức năng như sau:Chức năng Inno Setup Exec() Chờ trong một thời gian giới hạn

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

Bằng nhắc đến ewWaitUntilTerminated nó chờ đợi cho đến khi SomeExe.exe không bỏ thuốc lá. Tôi chỉ muốn chờ trong 10 giây.

Có giải pháp nào cho điều đó không?

+0

Và bạn sẽ làm gì sau 10 giây? – TLama

+0

Có lẽ anh ta muốn giết quá trình? Tôi cho rằng bạn có thể thực hiện nó bình thường và tạo ra bộ đếm thời gian đơn giản mà giết chết quá trình sau 10 giây. – Slappy

+0

@ Rất vui, bạn có thể sử dụng ví dụ: ['Sleep'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms686298%28v=vs.85%29.aspx) và sau đó giết quá trình. Vấn đề là bạn không biết những gì quá trình và như xa như tôi biết, từ các chức năng InnoSetup có sẵn không ai trả về xử lý quá trình thực hiện, mà bạn cần cho quá trình chấm dứt. Và nếu bạn biết quy trình xử lý, tốt hơn nên sử dụng ['WaitForSingleObject'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032%28v=vs.85%29. aspx) để chờ đợi. Xem bên dưới để biết mẫu mã. – TLama

Trả lời

7

Giả sử bạn muốn thực thi ứng dụng bên ngoài, chờ đợi chấm dứt trong một thời gian nhất định và nếu nó không bị tự hủy, hãy thiết lập mã sau đây. Đối với các hằng số huyền diệu được sử dụng ở đây, 3000 được sử dụng làm tham số trong hàm WaitForSingleObject là thời gian tính bằng mili giây trong khoảng thời gian thiết lập sẽ đợi cho quá trình chấm dứt. Nếu nó không chấm dứt ở thời điểm đó bởi chính nó, nó bị giết bởi các TerminateProcess chức năng, trong đó giá trị 666 là mã quá trình exit (khá ác trong trường hợp này :-)

[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; 

Mã Tôi đã thử nghiệm với Inno Setup 5.4.3 Unicode và ANSI phiên bản trên Windows 7 (nhờ kobik cho ý tưởng của mình để sử dụng định nghĩa có điều kiện cho khai báo hàm Windows API từ this post)

+0

Đây là một giải pháp tốt đẹp! – GTAVLover

Các vấn đề liên quan