Ошибка компилятора при использовании GetStringFileInfo в InnoSetup для приложения, созданного с помощью PyInstaller
Я создал файл информации о версии, как описано здесь. Как выглядит "файл версии"? и сделать получил EXE-файл со всей информацией о версии.
Моя проблема заключается в следующем, когда я пытаюсь собрать установочный файл с InnoSetup, я получаю сообщение об ошибке:
Ошибка в строке 65 в d:\installation\Source\setup_script.iss: отсутствует закрывающая кавычка для параметра "Имя"
строка 65:
[Icons]
Name: "{group}\{#VerInfoProductName}"; Filename: "{app}\{#ExeFileName}.exe"; WorkingDir: "{app}"
Значение VerInfoProductName
ниже
#define VerInfoProductName GetStringFileInfo(AddBackslash(SourcePath) + "..\..\dist\app\testapp.exe", "ProductName")
Подробности прилагаются в архиве.
1 ответ
В информационных строках версии вашего приложения есть что-то, что сбивает с толку препроцессор Inno Setup. Ваш код работает с другими приложениями.
Препроцессор загружает ProductName
таким образом, что результирующая переменная на самом деле длиннее значения, оставшееся пространство заполняется каким-то мусором, который позже сбивает с толку компилятор.
Вы можете обойти это, используя {#SetupSetting('AppName')}
вместо {#VerInfoProductName}
, Это, конечно, предполагает, что AppName
установлен в {#VerInfoProductName}
,
Другой способ заключается в обходе строки через файл INI:
#expr WriteIni("C:\path\xxx.ini", "xxx", "xxx", VerInfoProductName)
#define VerInfoProductName ReadIni("C:\path\xxx.ini", "xxx", "xxx")
На самом деле в обычных файлах ресурсов Windows (.rc
), необходимо явно завершить нулевую строку информации о версии (обратите внимание на \0
):
VALUE "ProductName", "TestProductName\0"
Полученный ноль (\0
) символ явно сохраняется в полученном двоичном файле. Таким образом, в итоге в полученном двоичном файле есть два нулевых символа (четыре 0 байта в кодировке UTF-16). Это распространенный формат WinAPI, когда допускается несколько значений. Нулевой символ - разделитель значений, двойной ноль завершает последовательность.
Ваш TestApp.exe
отсутствует этот второй ноль. Я вижу это в шестнадцатеричном дампе. Я уверен, что это основная причина вашей проблемы.