码迷,mamicode.com
首页 > 其他好文 > 详细

Inno Setup安装程序单例运行

时间:2017-05-26 11:52:41      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:app   访问   http   技术分享   方案   pre   name   set   运行时   

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安装程序单例运行

标签:app   访问   http   技术分享   方案   pre   name   set   运行时   

原文地址:http://www.cnblogs.com/crwy/p/6907571.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!