安装更新前关闭运行程序的版本(Inno Setup)

Dai*_*tsu 18 installer inno-setup

这应该很简单,我需要在安装程序启动时停止运行任何以前版本的程序.

大多数人建议exe在Inno Setup启动之前制作一个这样做并调用它.我创建了一个exe使用AutoIt来杀死我程序的所有进程.问题是我不知道在安装任何东西之前如何让Inno Setup调用它.

如何在安装文件之前调用可执行文件?

或者,如果我可以检测程序是否正在运行并告诉用户关闭它,那也可以.

mir*_*eil 30

如果应用程序具有Mutex,您可以AppMutex在Inno Setup安装程序中添加一个值,它将显示一条消息,告知用户停止该程序.您可以通过使用SysInternals Process Explorer并选择程序/进程并查看下部窗格中的Handles(CTRL-H)来找到Mutex(如果有的话).

这是一篇知识库文章的链接,提到了几种方法:http://www.vincenzo.net/isxkb/index.php? title
= Detect_if_an_application_is_running

或者,您可以在以下位置尝试此(UNTESTED)代码InitializeSetup:

[Setup]
;If the application has  Mutex, uncomment the line below, comment the InitializeSetup function out, and use the AppMutex.
;AppMutex=MyApplicationMutex

[Code]
const
  WM_CLOSE = 16;

function InitializeSetup : Boolean;
var winHwnd: Longint;
    retVal : Boolean;
    strProg: string;
begin
  Result := True;
  try
    //Either use FindWindowByClassName. ClassName can be found with Spy++ included with Visual C++. 
    strProg := 'Notepad';
    winHwnd := FindWindowByClassName(strProg);
    //Or FindWindowByWindowName.  If using by Name, the name must be exact and is case sensitive.
    strProg := 'Untitled - Notepad';
    winHwnd := FindWindowByWindowName(strProg);
    Log('winHwnd: ' + IntToStr(winHwnd));
    if winHwnd <> 0 then
      Result := PostMessage(winHwnd,WM_CLOSE,0,0);
  except
  end;
end;
Run Code Online (Sandbox Code Playgroud)

  • 对于Inno 5.5.0+,有一个新的解决方案,正如我在[后期回复](http://stackoverflow.com/a/13583126/255257)中对此问题进行了解释. (3认同)

jac*_*ate 20

在版本5.5.0(2012年5月发布)中,Inno Setup 在Windows Vista和更高版本上添加了对Restart Manager API的支持.

从MSDN链接文档引用(强调我的):

软件安装和更新需要重新启动系统的主要原因是正在更新的某些文件当前正由正在运行的应用程序或服务使用.Restart Manager可以关闭和重新启动除关键应用程序和服务之外的所有应用程序和服务.这将释放正在使用的文件并允许完成安装操作.它还可以消除或减少完成安装或更新所需的系统重启次数.

好处是:您不需要在安装程序或应用程序中编写自定义代码,要求用户关闭它,或自动关闭它.

如果您希望在更新完成后重新启动应用程序,则必须RegisterApplicationRestart先从应用程序中调用该功能.

新指令的默认值将关闭[Files]安装程序部分中包含的所有.exe,.dll和.chm文件.

与之相关的更改(来自发行说明):

  • 添加了新的[Setup]section指令:CloseApplications,默认为yes.如果设置为yes并且安装程序未以静默方式运行,则安装程序现在将暂停在准备安装向导页面上,如果它使用需要由[Files][InstallDelete]部分更新的文件检测应用程序,显示应用程序并询问用户安装程序是否应自动关闭应用程序并在安装完成后重新启动它们.如果设置为yes并且安装程序以静默方式运行,则安装程序将始终关闭并重新启动此类应用程序,除非通过命令行告知(请参见下文).
  • 添加了新的[Setup]section指令:CloseApplicationsFilter,默认为*.exe,*.dll,*.chm.控制安装程序将检查正在使用的文件.将其设置为*.*可以以牺牲速度为代价提供更好的检查.
  • 添加了新的[Setup]section指令:RestartApplications,默认为yes.注意:要使安装程序能够在安装完成后重新启动应用程序,应用程序需要使用Windows RegisterApplicationRestartAPI函数.
  • 添加了安装程序支持的新命令行参数:/NOCLOSEAPPLICATIONS/NORESTARTAPPLICATIONS.这些可用于覆盖new CloseApplicationsRestartApplications指令.
  • 增加了新的[Code]支持功能:RmSessionStarted.
  • TWizardForm:添加了新PreparingMemo属性.

  • 卸载时如何要求相同?请帮忙 (2认同)

zar*_*zar 13

我尝试使用接受的答案(以及jachguate的后续操作),但它不会杀死我的应用程序.看起来部分原因是我的应用程序窗口没有与之关联的文本,但无论真正的原因是什么,我使用shell命令来杀死它并且这很有效.在[code]部分中,您要添加以下功能.在复制安装文件之前调用它.

function PrepareToInstall(var NeedsRestart: Boolean): String;
var
ErrorCode: Integer;
begin
      ShellExec('open',  'taskkill.exe', '/f /im MyProg.exe','',SW_HIDE,ewNoWait,ErrorCode);
end;
Run Code Online (Sandbox Code Playgroud)


Con*_*oyd 5

如果您使用 InnoSetup,您可以考虑让 InnoSetup 安装程序执行 Windows SendBroadcastMessage,并让您的应用程序侦听该消息。当您的应用程序收到该消息时,它应该自行关闭。

我自己使用 InnoSetup 安装程序完成了此操作,效果非常好。