Inno Setup安装程序单例运行

Posted liujw_fc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Inno Setup安装程序单例运行相关的知识,希望对你有一定的参考价值。

1、源起:

KV项目下载底层升级包,老是报出升级文件占用问题,反复分析,不得其所。

今天突然发现同时启动多个升级程序实例,分析认为安装包同时被调用多次,引发实例访问文件冲突,导致此问题。

安装程序由Inno Setup制作,遂找其解决方案,最先想到的是互斥体,就由此开始!

 

2、AppMutex

[Setup]
AppMutex=MyAppMutex

安装程序Setup段,此互斥变量,会在安装程序启动时检测是否有此互斥体的程序在运行,若有则提示:

通常在程序中置同名互斥体,此处判断,可避免程序在运行时,安装包再去安装,比如产品升级。

好,可在安装程序中创建一互斥体,以其做为判断条件。  

 

3、CreateMutex()

Inno Setup中,此函数是创建互斥体的,我们在安装程序运行后创建互斥体,这样再次运行安装程序,就可互斥了。

[Code]
procedure InitializeWizard();
begin
  //开始运行,创建此互斥体
  CreateMutex(\'MyAppMutex\');
end;

注意此互斥体创建不能置于function InitializeSetup(): Boolean;函数, 它先于[Setup]段运行,会导致安装程序不能执行。

 

4、CheckForMutexes()

因为升级程序是静默安装的,以上代码虽可执行,但会弹出节2那个提示框,不够友好。

即使加静默安装参数/SP- /VERYSILENT也无济于事,它仍然不能避免此弹出框,怎么办?

这么办:

function InitializeSetup(): Boolean;
begin
  //若此例已运行,则不再执行
  Result := not CheckForMutexes(\'MyAppMutex\');
end;

此函数中判断互斥体,若已存在,直接退出,安静得像那夜的月光!

 

就这样,问题解决了。

大体来说,正常安装程序,需要弹提示框的,前三步都能解决问题,正常交互亦当如此。

而用互斥量处理多实例运行,相比FindWindowByWindowName()方法可靠的多,这个好用。

以上是关于Inno Setup安装程序单例运行的主要内容,如果未能解决你的问题,请参考以下文章

Inno Setup:安装其他安装程序并在继续安装之前运行它

Inno Setup 安装程序运行时命名检查问题

Inno SetupCreateProcess 失败:代码 740(Inno Setup打包的程序提升为管理员权限)(转)

inno setup静默安装的问题

Inno Setup安装卸载时判断是否程序正在运行

只允许运行一次 Inno Setup 安装程序