为EXE/DLL添加版本信息,奋战至深夜 收藏 作者:liigo

2023-10-22 13:59

本文主要是介绍为EXE/DLL添加版本信息,奋战至深夜 收藏 作者:liigo,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

原文链接:http://blog.csdn.net/liigo/archive/2008/12/06/3460565.aspx

转载请注明出处:http://blog.csdn.net/liigo/

所谓PE文件版本信息,本文最后有幅图,看了就很明了了。

为EXE/DLL添加版本信息,总体思路很简单,就是自行生成特定格式的资源数据,调用Win32API函数UpdateResource将该数据写入文件中即可(或者由编译器在输出文件时插入该数据)。

关 键是这一段数据的生成,相对比较复杂,而且繁索,不小心就还容易出错。这是一块纯数据(raw data),格式比较复杂,结构体嵌套N层,而这些个结构体的结构又不是固定不变的,用C语言根本无法描述,MSDN中也还要同时借助于自然语言才能表 达。首先,最顶层是一个VS_VERSIONINFO结构,它包含一个成员VS_FIXEDFILEINFO,并且有两个子成员 StringFileInfo和VarFileInfo;其中,StringFileInfo要包含一个子成员StringTable(外加 StringTable内N个子成员String),VarFileInfo要包含子成员Var。以上提到的各子成员,都分别是一个格式不固定的结构体, 组织这些数据时必须处理字节对齐问题。

无论如何,MSDN中的资料相对完整,细心耐心一些,总是可以完成这个工作。

我之所以奋战至深夜,是因为遇到几个一时无法解决的细节问题。写在这里,希望对其他人有点参考价值。

第一个问题:必须存在“文件版本”

StringFileInfo结构中的StringTable结构中必须包含一个KEY为“FileVersion”的String,否则,设定的其它所有版本信息项一定不会显示出来。

这 也许是微软的BUG吧,或者说是MSDN上的疏漏,没有写明。这个问题真是可恨,我(liigo)当时测试只是随便选了几项(如 CompanyName,ProductName)写入,结果死活显示不出来,把我的代码检查了一遍又一遍,与MSDN中的说明逐一核对,最后死活也想不 到是因为少写了FileVersion这么一项数据。我奋战至深夜,绝大部分时间用于总结出这么一条令人沮丧的沉痛经验!

第二个问题:“语言”

StringFileInfo 结构中的StringTable结构中的szKey成员,表示语言信息,MSDN中的说明不是很具体,我对比参考其它已经写入版本信息的EXE,得知 L"080404B0"表示“中文(中国)”,L"040904E4"表示“英语(美国)”。(当然还要相应的设置VarFileInfo结构中的Var 结构中的Value数值。如果没有VarFileInfo结构,或VarFileInfo.Var.Value值不对,版本信息也不会显示出来。)

第三个问题:字节对齐

以 上提到的所有结构体中,通常都有一到两个Padding成员,用于将下一个成员对齐到32字节位边界,这在MSDN中说明的比较明确。我(liigo)要 特别指出的是,在String结构中,MSDN定义中只在Value成员之前有一个Padding,用于将Value对齐到32位边界,其实在Value 成员之后也应该有一个Padding。因为多个String是邻接存放的,前一个String.Value可能会导致后一个String.Value无法 对齐到32位边界,这里需要特别注意。另,MSDN中明确说明,VS_VERSIONINFO中的wLength成员“不包含”本结构及其子结构的所有 Padding的长度,而我实际测试中发现,即使包含了所有Padding的长度,结果也是正确的,——去掉所有Padding的长度是需要额外的处理 的,我这里偷懒了。

第四个问题:VS_FIXEDFILEINFO中的无详细文档成员

VS_FIXEDFILEINFO 结构中的dwStrucVersion和dwFileFlagsMask,MSDN中并未具体说明应该给什么值,我随便给了0,经测试是可以的。该结构中 的dwFileDateMS和dwFileDateLS,MSDN要求给予文件写入时间,经测试用0也是可以的,这里又偷懒了,呵呵。


右键属性查看添加了版本信息的易语言主程序e.exe如下图所示:

e.exe file versioninfo

这篇关于为EXE/DLL添加版本信息,奋战至深夜 收藏 作者:liigo的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/261888

相关文章

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal

Linux中查看操作系统及其版本信息的多种方法

《Linux中查看操作系统及其版本信息的多种方法》在服务器运维或者部署系统中,经常需要确认服务器的系统版本、cpu信息等,在Linux系统中,有多种方法可以查看操作系统及其版本信息,以下是一些常用的方... 目录1. lsb_pythonrelease 命令2. /etc/os-release 文件3. h

Nginx屏蔽服务器名称与版本信息方式(源码级修改)

《Nginx屏蔽服务器名称与版本信息方式(源码级修改)》本文详解如何通过源码修改Nginx1.25.4,移除Server响应头中的服务类型和版本信息,以增强安全性,需重新配置、编译、安装,升级时需重复... 目录一、背景与目的二、适用版本三、操作步骤修改源码文件四、后续操作提示五、注意事项六、总结一、背景与

电脑提示d3dx11_43.dll缺失怎么办? DLL文件丢失的多种修复教程

《电脑提示d3dx11_43.dll缺失怎么办?DLL文件丢失的多种修复教程》在使用电脑玩游戏或运行某些图形处理软件时,有时会遇到系统提示“d3dx11_43.dll缺失”的错误,下面我们就来分享超... 在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是缺失某个dll文件。其中,d3dx11_4

游戏闪退弹窗提示找不到storm.dll文件怎么办? Stormdll文件损坏修复技巧

《游戏闪退弹窗提示找不到storm.dll文件怎么办?Stormdll文件损坏修复技巧》DLL文件丢失或损坏会导致软件无法正常运行,例如我们在电脑上运行软件或游戏时会得到以下提示:storm.dll... 很多玩家在打开游戏时,突然弹出“找不到storm.dll文件”的提示框,随后游戏直接闪退,这通常是由于

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程