Inno setup InnoSetup是否支持包含文件中的ExpandConstant功能?

Inno setup InnoSetup是否支持包含文件中的ExpandConstant功能?,inno-setup,Inno Setup,在主设置脚本文件中定义时,以下函数可以正常工作: function PrevInstallExists: Boolean; var Value: string; UninstallKey: string; begin UninstallKey := 'Software\Microsoft\Windows\CurrentVersion\Uninstall\' + ExpandConstant('{#SetupSetting("AppId")}') + '_is1'; //M

在主设置脚本文件中定义时,以下函数可以正常工作:

function PrevInstallExists: Boolean;
var
  Value: string;
  UninstallKey: string;
begin
  UninstallKey := 'Software\Microsoft\Windows\CurrentVersion\Uninstall\' +
    ExpandConstant('{#SetupSetting("AppId")}') + '_is1';
  //MsgBox(UninstallKey, mbConfirmation, MB_OK);
  Result := (RegQueryStringValue(HKLM, UninstallKey, 'UninstallString', Value) or
    RegQueryStringValue(HKCU, UninstallKey, 'UninstallString', Value)) and (Value <> '');
end;

取消注释MsgBox行时,您将看到ExpandConstant函数不返回任何内容。我假设这是因为AppId是在主脚本文件中定义的,而不是在包含的文件中定义的。除了将ExpandConstant调用移到这个util函数之外并将其作为参数传递,还有其他解决方案吗?

除了在定义AppId指令后包含文件之外,我不这么认为。就是这样,我已经在文件顶部附近包含了它。把它移到我的主代码部分上面,现在就可以了!这是因为预处理器并不关心脚本的正确性。它只是从上到下,将文件粘在一起并计算变量。由于您在AppId指令之前就包含了该文件,因此当时它是空的。它在处理包含的文件后获得了值。请注意,{…}值在编译时展开,因此不需要对它们使用ExpandConstant,除非它们内部包含运行时常量。对于AppId,通常只有在使用GUID时才会出现这种情况,结果是将初始值{增加了一倍。是的,我的AppId是一个GUID,我记得我过去在这方面确实有问题。我不应该在那里使用GUID吗?我想大多数应用程序都会这样做。但这可能是一个新问题。
#include "scripts\util-code.iss"