Как объявить переменную препроцессора Inno Setup, читая из файла

Хорошо, я знаю, что вы можете сделать это в Inno Setup:

#define AppVer "0.0.11"

Тогда используйте это как

[Setup]
AppVerName={#AppVer}

Теперь представьте, что у меня есть файл с именем VERSION, содержимое которого "0.0.11".

Есть ли способ, как содержимое файла VERSION в переменную препроцессора Inno Setup каким-то образом?

Ответ 1

Использование функции ISPP GetFileVersion - предпочтительный метод (поскольку ваша версия установщика должна соответствовать вашей версии приложения, в конце концов). Поэтому, если это то, что вы действительно хотели сделать, вы должны принять ответ jachguate.

Если вы действительно хотите прочитать версию из текстового файла, а не из исполняемого файла, то есть две возможности:

Первое: если вы можете изменить внутренний формат файла, вы можете значительно упростить его, сделав его похожим на файл INI:

[Version]
Ver=0.0.11

Учитывая это, вы можете использовать функцию ISPP ReadIni для извлечения версии:

#define AppVer ReadIni("ver.ini", "Version", "Ver", "unknown")

Вторая альтернатива, если вы не можете изменить формат файла, заключается в использовании функций FileOpen, FileRead и FileClose ISPP, например:

#define VerFile FileOpen("ver.txt")
#define AppVer FileRead(VerFile)
#expr FileClose(VerFile)
#undef VerFile

Я повторяю, однако: лучше получить версию приложения из самого исполняемого файла. Это помогает обеспечить, чтобы все соответствовало друг другу.

Ответ 2

Вы можете использовать функцию Inno Setup Pre Proccessor (ISPP) GetFileVersion, чтобы получить версию непосредственно из исполняемого файла, например:

[Setup]
#define AppVersion GetFileVersion("MyFile.exe")
#define AppName "My App name"

AppName={#AppName}
AppVerName={#AppName} {#AppVersion}
VersionInfoVersion={#AppVersion}

; etc

Если вы используете define, вы уже используете ISPP.

Ответ 3

Если вы хотите сделать это во время установки установщика (ответ @jachguate охватывает другую возможность и, вероятно, тот, который вы ищете - я оставлю это на случай, если это поможет другим в какой-то момент), вы можете использовать его Pascal Script для этого. Что-то вроде этого должно работать:

[Setup]
AppVer={code:MyVersion}

[Files]
// Other files
Source: "YourVersionFile.txt"; DestDir: "{app}"

[Code]
function MyVersion(Param: String): String;
var
  VersionValue: string;
  VersionFile: string;
begin
  // Default to some predefined value.
  Result := '0.0.0';
  VersionFile := '{app}\YourVersionFile.txt';
  if LoadStringFromFile(VersionFile, VersionValue) then
    Result := VersionValue;
end;

Дополнительную информацию см. в разделе справки "Pascal Scripting", включая список поддерживаемых встроенных функций.

Ответ 4

От: http://www.jrsoftware.org/ishelp/

Поддерживается C-like #include директива, которая вытягивает строки из отдельного файла в script в позицию директивы #include. Синтаксис:

#include "filename.txt"

Если имя файла не полностью определено, компилятор будет искать его в том же каталоге, что и файл, содержащий директиву #include. Имя файла может быть префикс compiler:, и в этом случае он ищет файл в каталоге компилятора.