在我的Inno Setup腳本中,我正在執行第三方可執行文件。我使用如下的Exec()
功能:Inno Setup Exec()函數等待有限時間
Exec(ExpandConstant('{app}\SomeExe.exe'), '', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
通過提ewWaitUntilTerminated
這裏等到SomeExe.exe
不退出。我只想等10秒。
有沒有解決方案?
在我的Inno Setup腳本中,我正在執行第三方可執行文件。我使用如下的Exec()
功能:Inno Setup Exec()函數等待有限時間
Exec(ExpandConstant('{app}\SomeExe.exe'), '', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
通過提ewWaitUntilTerminated
這裏等到SomeExe.exe
不退出。我只想等10秒。
有沒有解決方案?
假設你想執行外部應用程序,等待其終止在指定的時間,如果它不是由本身的設置殺死它終止試試下面的代碼。到這裏使用的魔法常量,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函數的聲明)
這是一個不錯的解決方案! – GTAVLover
,哪些是你會是10秒後做什麼? – TLama
也許他想殺死這個過程?我想你可以正常執行並創建簡單的定時器,在10秒後殺死進程。 – Slappy
@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