Почему препроцессор ведет себя иначе в директиве #include, чем в разделе [Files] Inno Setup script - PullRequest
0 голосов
/ 14 декабря 2018

Пытался понять разницу между синтаксисом, который включал бы другой файл сценария и исходный файл в сценарии установки Inno, при использовании макросов для поиска и поиска файлов.

Я пытался использовать функцию FindFolderиз Найти каталог с помощью подстановочного знака в Inno Setup :

#define FindFolder(Path) \
    Local[0] = FindFirst(Path, faDirectory), \
    Local[0] ? AddBackslash(ExtractFileDir(Path)) + FindGetFileName(Local[0]) : Path

Как это:

#include "{#FindFolder('..\..\..\packages\ScriptPreRequisites*')}\DotNetDependencies.iss"

1 Ответ

0 голосов
/ 14 декабря 2018

В пределах # вы находитесь в «царстве» Препроцессор Inno Setup .

Существует два способа войти в царство препроцессора.

  • Полный синтаксис строки:

    #directive args
    
  • И встроенный синтаксис:

    {#directive args}
    

    Встроенный синтаксис почти исключительноиспользуется для директивы emit - {#emit <expression>}.И по этой причине существует сокращенный формат с опущенным emit: {#<expression>}.

Встроенный синтаксис полезен, когда вы хотите использовать выражение препроцессора вне области препроцессора.Как и в обычных разделах Inno Setup (или в коде Pascal Script):

[Files]
Source: "{#FindFolder("..\packages\PackagesA*")}\*.*"; DestDir: "{app}"; \
    flags: recursesubdirs  

Хотя в директиве препроцессора #include вы уже находитесь в области препроцессора.И там синтаксис {#xxx} недопустим (теоретически он может иметь другое значение [valid], но на самом деле фигурные скобки не используются в препроцессоре).

Синтаксис директивы #include:1039 *

#include <expression>

Препроцессор использует C-подобный синтаксис выражения .Итак, ваше выражение в этом случае:

FindFolder('..\..\..\packages\ScriptPreRequisites*') + '\DotNetDependencies.iss'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...