【问题标题】:Compiler error when using GetStringFileInfo in InnoSetup on application created with PyInstaller在使用 PyInstaller 创建的应用程序的 InnoSetup 中使用 GetStringFileInfo 时出现编译器错误
【发布时间】:2015-06-03 04:23:20
【问题描述】:

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

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

d:\installation\Source\setup_script.iss 中的第 65 行出错:缺失 参数“名称”的结束引号

第 65 行:

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

下面VerInfoProductName的定义

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

详情附in archive。

【问题讨论】:

  • 更新了第 65 行的描述。谢谢!
  • 请查看附件详情。

标签: python installation inno-setup pyinstaller fileversioninfo


【解决方案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) 字符显式存储在生成的二进制文件中。所以最后在生成的二进制文件中有两个空字符(UTF-16 编码中有四个 0 字节)。当允许多个值时,这是常见的 WinAPI 格式。空字符是值分隔符,双空字符终止序列。

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

【讨论】:

  • 你是对的。我错过了检查预处理脚本。在不同的部分中使用该变量时,该脚本是可编译的,但条目被剪切了。
  • 我也在考虑。谢谢你们!需要调整python代码
  • @SpanishBoy 欢迎您。考虑在What does a “version file” look like? 上确认结果
猜你喜欢
  • 2021-12-12
  • 2022-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 2017-01-06
  • 1970-01-01
  • 2012-02-19
相关资源
最近更新 更多