Как объявить переменную препроцессора 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:
, и в этом случае он ищет файл в каталоге компилятора.