首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Inno Setup Exec()函数等待有限的时间

Inno Setup Exec()函数等待有限的时间
EN

Stack Overflow用户
提问于 2012-06-05 14:11:07
回答 1查看 6.1K关注 0票数 6

在我的Inno设置脚本中,我正在执行第三方可执行文件。我使用Exec()函数,如下所示:

代码语言:javascript
运行
复制
Exec(ExpandConstant('{app}\SomeExe.exe'), '', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);

通过提到ewWaitUntilTerminated,它会一直等到SomeExe.exe不退出。我只想等10秒。

有什么解决方案吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-06 16:34:49

假设您想要执行外部应用程序,等待其终止一段指定的时间,如果它不是自己终止的,请从安装程序中终止它,尝试使用以下代码。对于这里使用的神奇常量,在WaitForSingleObject函数中用作参数的3000是设置等待进程终止的时间(以毫秒为单位)。如果它没有在该时间内自行终止,它将被TerminateProcess函数终止,其中666值是进程退出代码(在本例中非常糟糕:-)

代码语言:javascript
运行
复制
[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 'WaitForSingleObject@kernel32.dll stdcall';
function TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL;
  external 'TerminateProcess@kernel32.dll 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;

我在Windows7上使用Inno Setup 5.4.3 Unicode和ANSI版本测试的代码(感谢kobik的想法,他为this post的Windows API函数声明使用了条件定义)

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10892452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档