zoukankan      html  css  js  c++  java
  • 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()方法可靠的多,这个好用。

  • 相关阅读:
    支持向量机(一)
    决策树(四)
    决策树(三)
    决策树(二)
    决策树(一)
    朴素贝叶斯(一)
    k近邻法(二)
    k近邻法(一)
    感知机
    mercurial 入门
  • 原文地址:https://www.cnblogs.com/crwy/p/6907571.html
Copyright © 2011-2022 走看看