在使用 PyInstaller 创建的应用程序的 InnoSetup 中使用 GetStringFileInfo 时出现编译器错误

Compiler error when using GetStringFileInfo in InnoSetup on application created with PyInstaller

我按照此处所述创建了版本信息文件 - What does a "version file" look like? 并获得包含所有版本信息的 EXE 文件。

我的下一个问题是,当我尝试使用 InnoSetup 构建安装文件时,出现错误:

Error on line 65 in d:\installation\Source\setup_script.iss: Missing closing quote on parameter "Name"

第 65 行:

[Icons]
Name: "{group}\{#VerInfoProductName}"; Filename: "{app}\{#ExeFileName}.exe"; WorkingDir: "{app}"

下面VerInfoProductName的定义

#define VerInfoProductName GetStringFileInfo(AddBackslash(SourcePath) + "..\..\dist\app\testapp.exe", "ProductName")

详情已附上in archive

您的应用程序版本信息字符串中有些内容会混淆 Inno Setup 预处理器。您的代码适用于其他应用程序。

预处理器以结果变量实际上比值长的方式加载 ProductName,剩余的 space 填充了一些垃圾,这些垃圾后来会混淆编译器。

您可以使用 {#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) 中,必须显式地以 null 终止版本信息字符串(注意 [=18=]):

VALUE "ProductName", "TestProductName[=11=]"

生成的空 ([=18=]) 字符显式存储在生成的二进制文件中。所以最后在生成的二进制文件中有两个空字符(UTF-16 编码中的四个 0 字节)。当允许多个值时,这是常见的 WinAPI 格式。空字符是值分隔符,双空字符终止序列。

您的 TestApp.exe 缺少第二个空值。我可以在十六进制转储中看到它。我很确定这是您遇到问题的主要原因。