Ошибка компилятора при использовании 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 отсутствует этот второй ноль. Я вижу это в шестнадцатеричном дампе. Я уверен, что это основная причина вашей проблемы.

Другие вопросы по тегам