如果软件已安装旧版本,我需要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]
部分?
非常感谢任何帮助/提示!
答案 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函数。 这是两件不同的事情 你可以在预处理器中定义一个宏 - 这有点像一个函数, 但这不是你想要的,因为预处理器只在编译时运行,所以它不能用来检查用户文件/环境的状态。