NSIS 获取 UPX 压缩的 EXE 文件版本
NSIS Get file version of EXE that is UPX Compressed
几年来我一直在使用一个小的 NSIS 脚本来获取 EXE 的版本,这样我就可以在安装程序的欢迎文本中显示它。
我在这里得到脚本:http://nsis.sourceforge.net/Invoking_NSIS_run-time_commands_on_compile-time
!define File "C:\MyFile.exe"
OutFile "GetVersion.exe"
SilentInstall silent
Section
## Get file version
GetDllVersion "${File}" $R0 $R1
IntOp $R2 $R0 / 0x00010000
IntOp $R3 $R0 & 0x0000FFFF
IntOp $R4 $R1 / 0x00010000
IntOp $R5 $R1 & 0x0000FFFF
StrCpy $R1 "$R2.$R3.$R4.$R5"
## Write it to a !define for use in main script
FileOpen $R0 "$EXEDIR\Version.txt" w
FileWrite $R0 '!define Version "$R1"'
FileClose $R0
SectionEnd
最近开始用UPX压缩应用程序的EXE
现在它是 UPX 压缩的,文件版本脚本不再有效,我猜是由于非标准 header 布局。
如何从 UPX 压缩的 EXE 中读取文件版本?
更新:现在已关闭,但我后来发现这可能与某种提升的权限问题和 运行 映射驱动器上的命令有关。
即使在使用 UPX --ultra-brute test.exe
时,版本信息块在我尝试时也没有得到压缩。您使用的是特殊的 UPX 开关吗?你试过了吗--keep-resource=%resourceid%
?
如果您使用的是 NSIS v3,则可以使用 !getdllversion
在编译时获取版本,而不必使用 !system
.
几年来我一直在使用一个小的 NSIS 脚本来获取 EXE 的版本,这样我就可以在安装程序的欢迎文本中显示它。
我在这里得到脚本:http://nsis.sourceforge.net/Invoking_NSIS_run-time_commands_on_compile-time
!define File "C:\MyFile.exe"
OutFile "GetVersion.exe"
SilentInstall silent
Section
## Get file version
GetDllVersion "${File}" $R0 $R1
IntOp $R2 $R0 / 0x00010000
IntOp $R3 $R0 & 0x0000FFFF
IntOp $R4 $R1 / 0x00010000
IntOp $R5 $R1 & 0x0000FFFF
StrCpy $R1 "$R2.$R3.$R4.$R5"
## Write it to a !define for use in main script
FileOpen $R0 "$EXEDIR\Version.txt" w
FileWrite $R0 '!define Version "$R1"'
FileClose $R0
SectionEnd
最近开始用UPX压缩应用程序的EXE
现在它是 UPX 压缩的,文件版本脚本不再有效,我猜是由于非标准 header 布局。
如何从 UPX 压缩的 EXE 中读取文件版本?
更新:现在已关闭,但我后来发现这可能与某种提升的权限问题和 运行 映射驱动器上的命令有关。
即使在使用 UPX --ultra-brute test.exe
时,版本信息块在我尝试时也没有得到压缩。您使用的是特殊的 UPX 开关吗?你试过了吗--keep-resource=%resourceid%
?
如果您使用的是 NSIS v3,则可以使用 !getdllversion
在编译时获取版本,而不必使用 !system
.