我在使用以下代码时遇到问题,它正在添加额外的“{”。
例如:
[Setup]
AppID={{E643099E-1ECE-474F-B043-1E7A7CE405AA}
[Code]
const
INSTALL_KEY = 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppId")}_is1';
返回以下内容:
INSTALL_KEY = 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{{E643099E-1ECE-474F-B043-1E7A7CE405AA}_is1';
显然无法使用RegKeyExists(HKLM,INSTALL_KEY)检测该密钥,因为额外的“{”不在实际路径中,如果删除[Setup]中的额外字符,脚本将无法编译因为那时它认为它是一个常数。
答案 0 :(得分:2)
使用StringChange()
删除额外的{
:
[Setup]
AppID={{E643099E-1ECE-474F-B043-1E7A7CE405AA}
[Code]
const INSTALL_KEY = '...\Uninstall\{#emit StringChange(SetupSetting("AppId"),"{{","{")}_is1';
答案 1 :(得分:1)
我认为解析器不允许使用{}
字符所包含的自定义常量,因为它们被用作the constants
的引导者,所以我认为你必须解决它。以下是其中一个选项:
[Setup]
AppID=E643099E-1ECE-474F-B043-1E7A7CE405AA
[code]
const
INSTALL_KEY = '...\Uninstall\{{#emit SetupSetting("AppId")}}_is1';
我的猜测是你所描述的情况只是一个意外的错误,因为编译器会提示你在常量的开头使用双括号,但是当你发出这样的常量时,你会得到同样的双括号。
答案 2 :(得分:1)
此问题似乎在更高版本的Inno Setup(5.5.5)上得到解决。以下代码工作正常:
[Setup]
AppId={{********-****-****-****-********}
...
[code]
sAppId := ExpandConstant('{#emit SetupSetting("AppId")}_is1');
sUnInstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\') + sAppId;
答案 3 :(得分:1)
解决方案是使用ExpandConstant
函数,正如其他人已经提到的那样。
[Setup]
AppId={{E643099E-1ECE-474F-B043-1E7A7CE405AA}
[Code]
var
INSTALL_KEY: String;
function InitializeSetup(): Boolean;
begin
INSTALL_KEY := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppId")}_is1');
MsgBox(INSTALL_KEY, mbInformation, MB_OK);
end;
这是预期的行为,而不是错误。在[Code]
部分,constants和scripted constants未展开,而emit preprocessor directives {#emit ...}
/ {#...}
的值被ISPP替换。因此,您需要使用ExpandConstant函数将{{
转换为{
。
在这种情况下,由于使用了INSTALL_KEY
函数,因此无法将ExpandConstant
定义为Pascal常量。
答案 4 :(得分:0)
您还可以将应用程序ID定义为常量,并使用它:
#define MyAppID "{{E643099E-1ECE-474F-B043-1E7A7CE405AA}"
[Setup]
AppId={#MyAppID}
[Code]
const INSTALL_KEY = '...\Uninstall\' + ExpandConstant('{#MyAppID}') + '_is1';