从包含文件

时间:2015-10-21 21:07:58

标签: inno-setup

我已阅读in an answer by TLama如何将设置发布到代码部分,以便可以在运行时使用它。只要它在一个文件中,它就可以工作。但是,如果我有

test.iss

#include "include.iss"
[Setup]
AppId={{87E1AD40-F32B-4EF7-A2FF-5B508814068A}
AppName=My Program
AppVersion=1.5
DefaultDirName=My Program

和include.iss

[Code]
procedure InitializeWizard;
var
  S: string;
begin
  S := '{#SetupSetting("AppId")}';
  MsgBox(S, mbInformation, MB_OK);
end;

我收到一个空消息框。 documentation on SetupSetting不是很冗长。

有解决方案吗?我的设置有点大,我执行#include以避免重复代码同一程序的不同版本。

2 个答案:

答案 0 :(得分:1)

可以通过为AppId定义预处理器值来解决此问题,例如: AppGUID,然后改为使用它:

test.iss

#define AppGUID "{87E1AD40-F32B-4EF7-A2FF-5B508814068A}"
#include "include.iss"

[Setup]
AppId={{#AppGUID}
AppName=My Program
AppVersion=1.5
DefaultDirName=My Program

include.iss

[Code]
procedure InitializeWizard;
var
  S: string;
begin
  S := '{#AppGUID}';
  MsgBox(S, mbInformation, MB_OK);
end;

答案 1 :(得分:1)

关键是SetupSetting documentation

的这一部分
  

解析当前翻译

中的[设置]部分

"current translation" is defined为:

  

指的是ISPP的当前输出,脚本的翻译(预处理)部分直到ISPP当前正在处理的点(或行)

当您#include时,AppId尚未定义。

解决方案是将#include移到Setup部分下方:

[Setup]
AppId={{87E1AD40-F32B-4EF7-A2FF-5B508814068A}
...

#include "include.iss"

或者,正如您自己发现的那样,使用预处理器变量。