相对于另一个文件夹中包含的 .iss 文件解析文件路径

Resolve file paths relatively to a .iss file included from another folder

我正在使用 #include 预处理器指令来包含其他 .iss 文件,这些文件包含我的驱动程序安装的单独组件。

[Files]
#include "subfolder\issComponent.iss"

issComponent.iss从其自己的相对路径执行驱动程序安装。

[Files]
Source: "Driver\Driver.exe"; DestDir: "{tmp}"; Flags: ignoreversion deleteafterinstall

[Run]
Filename: "{tmp}\Driver.exe";

当我尝试构建 main/calling 脚本时,Driver.exe 的相对路径不起作用,因为相对路径是从 main/calling 脚本的位置引用的。

路径从 issComponent.iss 解析为

.\Driver\Driver.exe

而不是

.\subfolder\Driver\Driver.exe

因为 include 语句直接包含文件语句,而不是从它自己的路径编译它。这就是导致错误的原因。我想知道是否有办法在两个位置正确使用相对路径。

#include 由预处理器解释。 [Files](和其他部分)由编译器解释。这些是相互不了解的独立组件。就像在 C/C++ 中一样。预处理器将 issComponent.iss 合并到主 .iss 文件中,如下所示:

[Files]
[Files]
Source: "Driver\Driver.exe"; DestDir: "{tmp}"; Flags: ignoreversion deleteafterinstall

[Run]
Filename: "{tmp}\Driver.exe";

而且编译器甚至不知道这些行最初在不同的文件中,只知道在不同的文件夹中。


您可以利用一些预处理器功能来实现您想要的。例如 __PATHFILENAME__ predefined variable,它解析为引用它的 .iss 文件的路径。

#define PathToSelf ExtractFileDir(__PATHFILENAME__)
Source: "{#PathToSelf}\MyProg.exe"; DestDir: "{app}"

这将导致最终的 .iss 脚本如下:

[Files]
[Files]
Source: "C:\full\path\to\subfolder\Driver\Driver.exe"; DestDir: "{tmp}"; Flags: ignoreversion deleteafterinstall

[Run]
Filename: "{tmp}\Driver.exe";