Inno Setup:如何从InstallDelete部分调用自定义函数

时间:2015-09-15 22:39:09

标签: inno-setup pascalscript

如果软件已安装旧版本,我需要Inno Setup生成的安装程序在安装前删除某些文件。

我尝试通过比较版本号(下面的自定义函数)来做到这一点,但在编译时,Inno Setup会生成错误:

  

[ISPP]未声明的标识符:“GetInstalledVersion”。

Inno Setup脚本相关提取是:

(...)
[Code]
function GetInstalledVersion(MandatoryButNotUsedParam: String): String;
var Version: String;
begin
  if RegValueExists(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+ExpandConstant('AppId')+'_is1', 'DisplayVersion') then
    begin
      RegQueryStringValue(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+ExpandConstant('AppId')+'_is1', 'DisplayVersion', Version);
      MsgBox(ExpandConstant('Existing version:'+Version+'  New version:'+ExpandConstant('AppVersion')), mbInformation, MB_OK);
      Result := Version;
    end
  else
    begin
      Result := '';
    end
end;
(...)
[InstallDelete]
#define InstalledAppVersion GetInstalledVersion('')
#if "1.013" > InstalledAppVersion
  Type: files; Name: {userappdata}\xxx\*.hhd
#endif

对Inno Setup不熟悉,这肯定是一个微不足道的问题,但在论坛上没有找到答案。问题是:如何从GetInstalledVersion部分正确调用函数[InstallDelete]

是否存在问题,因为在[InstallDelete]部分被阅读之前可能会调用[code]部分?

非常感谢任何帮助/提示!

1 个答案:

答案 0 :(得分:3)

您要检查当前安装的版本吗?如果它低于1.013, 然后从{userappdata}\xxx\*.hhd删除用户文件?

然后你需要的是参数Check http://www.jrsoftware.org/ishelp/index.php?topic=scriptcheck

[Code]
function isOldVersionInstalled: Boolean;
begin
  // Result := <True|False>;
end;

[InstallDelete]
Type: files; Name: {userappdata}\xxx\*.hhd; Check:isOldVersionInstalled;

您的示例有什么问题:

您正在从预处理器调用Pascal函数。 这是两件不同的事情 你可以在预处理器中定义一个宏 - 这有点像一个函数, 但这不是你想要的,因为预处理器只在编译时运行,所以它不能用来检查用户文件/环境的状态。