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
)
Và bạn sẽ làm gì sau 10 giây? – TLama
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
@ 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