在使用 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
缺少第二个空值。我可以在十六进制转储中看到它。我很确定这是您遇到问题的主要原因。
我按照此处所述创建了版本信息文件 - 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
缺少第二个空值。我可以在十六进制转储中看到它。我很确定这是您遇到问题的主要原因。