innosetup安装前的准备函数InitializeSetup()

本文介绍了Inno Setup安装包中的InitializeSetup()函数,用于在安装前执行判定和操作,如禁止安装旧版本、执行Shellexec函数、卸载原程序以及运行Cmd命令。通过示例代码展示了如何实现这些功能,确保安装过程顺利进行。

Inno Setup 安装包

安装前执行InitializeSetup()函数

在安装时,需要在运行安装包进行安装前,做一些判定是否继续安装的工作,在Inno 的脚本里写InitializeSetup()函数即可。

function InitializeSetup(): Boolean;
Called during Setup's initialization. Return False to abort Setup, True otherwise.

函数InitializeSetup():布尔值;

在安装程序初始化期间调用。返回False中止安装,返回True表示继续安装。

 

需求:禁止安装旧的版本。

重载安装程序初始化函数,判断是否已经安装新版本,如果是则禁止安装。

function InitializeSetup() : boolean;
begin
#ifndef PortableBuild
#ifdef OnlyInstallNewVersion
  if is_installed_before() then
  begin
    if is_installing_older_version() then
    begin
      MsgBox(CustomMessage('init_setup_outdated_version_warning'), mbInformation, MB_OK);
      Result := False;
    end else
    begin
      Result := True;
    end;
  end else
  begin
    Result := True;
  end;
#else
  Result := True;
#endif
#else
  Result := True;
#endif
end;

但有时候需要执行一些复杂的操作。需要用到执行exe程序。甚至是用管理员权限进程操作,用管理员权限的时候,最好是让安装包获得管理员权限去执行,这样用户体验才会流畅。

Shellexec函数

Inno Setup 的Shellexec函数的功能类似Windows API 的ShellExecute函数,它被用来执行某种操作,可以是开启一个进程,也可以打开一个浏览器等等。

不过,Inno Setup 的Shellexec有一个优点,这个优点体现在第六个参数上。
首先看shellexec:

function ShellExec(

                             const Verb,

                             Filename,

                             Params, 

                             WorkingDir: String;

                             const ShowCmd: Integer;

                             const Wait: TExecWait;

                             var ErrorCode: Integer): Boolean;

第一个参数表示执行的动作,一般开启一个进程使用'open',第二个参数表示进程名(包含路径),第三个参数表示命令行参数,第四个参数是工作路径,第五个参数表示是否显示,第七个参数是一个错误码。

第六个参数表示如下:

TExecWait = (ewNoWait, ewWaitUntilTerminated, ewWaitUntilIdle);

如果使用ewNoWait,那么ShellExec开启进程以后立即返回。

如果使用ewWaitUntilTerminated,则ShellExec开启进程以后阻塞,知道被开启的进程终止以后才返回。

如果使用ewWaitUntilIdle,则ShellExec在CPU空闲的时候返回。

其中ewWaitUntilTerminated很有用,这样可以在一个安装程序中随意的控制执行其他的操作。

 

安装前卸载

Inno Setup 安装前卸载原程序
很多時候我们需要在安装文件之前卸载原有的程序而不是覆盖安裝,下面的代码就是实现了这个的功能。

实现原理是:从注册表的'UninstallString'项中读取卸载信息,卸载程序,用Exec执行卸载程序,参数选择静默方式执行。
下面code中APP_NAME是程序名。

 
  function InitializeSetup(): boolean;
     var
     ResultStr: String;
     ResultCode: Integer;
     begin
         if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\APP_NAME', 'UninstallString', ResultStr) then
          begin
             ResultStr := RemoveQuotes(ResultStr);
             Exec(ResultStr, '/silent', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
          end;
          result := true;
 end;

 

 安装前执行Cmd命令

//重载安装程序初始化函数,判断执行cmd命令
function InitializeSetup() : boolean;
 var
  ResultStr: String;
  ResultCode: Integer;
begin
   
      //Exec('cmd.exe', 'net stop WhatSvc', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
      ShellExec('', 'cmd.exe', 'cmd /c net stop WhatSvc& sc delete WhatSvc', '', SW_HIDE, ewWaitUntilTerminated, ResultCode); 
    
    result := true;
end;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值