首页 > 代码库 > Inno Setup安装程序单例运行
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安装程序单例运行
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。