`
ruilin215
  • 浏览: 1143862 次
  • 性别: Icon_minigender_2
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

为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的版本号

    最近做自动化编译时,没办法自动获取编译后的版本号进行打包,所以就写了这个小工具,使用方法以为: version abc.exe 返回为abc.exe的版本号如:1.2.0.2。源代码也带上了,大家有问题,可以自己修改。

    强制删除任何EXE文件和被加载的DLL文件!

    强制删除任何EXE文件和被加载的DLL文件!

    PB读取系统版本/读取EXE版本/读取DLL版本

    在IT领域,尤其是在软件开发中,获取应用程序或系统的版本信息是一项基本任务,这对于软件兼容性、更新管理和故障排查至关重要。本主题将详细讲解如何在PowerBuilder(PB)环境中读取系统版本、EXE(可执行文件)...

    pb 取EXE/DLL的文件版本

    在IT行业中,获取一个应用程序(如EXE或DLL)的文件版本信息是非常常见的需求,这有助于我们了解软件的更新状态、兼容性等信息。本文将详细介绍如何使用PowerBuilder(PB)通过API调用来获取文件的版本号,主要涉及...

    ToYcon.exe EXE/DLL/PE文件 简单ico、png 图标提取工具

    ToYcon.exe EXE/DLL/PE文件 简单ico、png 图标提取工具

    EXE/DLL文件中的资源(位图、图标、字符串等)查看器

    EXE/DLL文件中的资源(位图、图标、字符串等)查看器。以及版本信息等。代码较老,是VC6的项目工程,不过还是可用的,值得参考

    EXE/DLL文件字符串替换工具showstring汉化版.rar

    软件介绍: showstring能够打开可执行文件EXE/DLL,从中搜索并替换指定的字符串。支持ASCII/UNICODE类型的字符串。能逐个字符地扫描文件,根据选项要求来设定如何搜索。

    pyzbar库PyInstallerImportError: Failed to load dynlib/dll问题解决

    3. **修改spec文件**:如果使用PyInstaller的spec文件,可以在其中添加`a.binaries += [('path_to_dll', 'dll_name', 'BINARY')]`,确保dll被包含在生成的可执行文件中。 4. **更新PyInstaller和pyzbar**:确保你...

    UPXShell v3.0.9.2511 (Exe/Dll压缩外壳)

    UPXShell,Exe/Dll压缩外壳,调用Upx.exe压缩,DELPHI完整代码.

    DELPHI 给DLL 添加版本信息

    在软件开发过程中,尤其是在使用 Delphi 进行编程时,为了更好地管理和标识所创建的可执行文件(.exe)或动态链接库(.dll)文件,通常需要为其添加版本信息。这样做的目的是为了方便用户识别产品的来源、开发者、...

    JAVA取得exe、dll文件的版本号

    JAVA取得可执行程序、文件的版本号 JAVA取得exe、dll文件的版本号

    获取exe和dll文件的版本号

    在编程领域,尤其是在软件开发和测试中,了解可执行文件(如EXE和DLL)的版本信息是非常重要的。这些信息可以提供关于软件组件的详细历史、更新状态以及可能的兼容性问题。本篇文章将深入探讨如何使用C#语言来获取...

    Vb提取抓出EXE/DLL应用程序的图标并存档

    从DLL和EXE文件中提取图标,并显示在图片框上Vb提取抓出EXE/DLL应用程序的图标并存档,有些程序内的图标不只有一个,是一组图标,用于在不同状态下显示,不管有多少个图标,本程序都能提取到,并且可以将选中的图标...

    UPXShell,Exe/Dll压缩外壳,调用Upx.exe压缩,DELPHI完整代码.

    UPXShell,Exe/Dll压缩外壳,调用Upx.exe压缩,DELPHI完整代码.跟AsPack很像,功能差不多,都是压缩PE文件的,只不过, 把原来的命令行 转成了 图形界面,在内部调用UPX命令,更容易使用。

    exe,dll版本,名称信息修改代码

    在Windows操作系统中,EXE和DLL文件包含了关于程序的各种元数据,如版本信息、产品名称、版权信息等。这些信息对于软件的管理和更新至关重要。在编程过程中,有时我们需要修改这些元数据,例如为了定制品牌或者更新...

    vs2005根据当前日期或指定版本号修改exe或dll版本号

    自己用vs2005写的小程序,用于根据当前日期或指定版本号修改exe或dll的版本号。 将编译生成的VersionConversion.exe放在欲改版本号的exe或dll相同文件夹中,修改VersionConversion.ini中的FillName值和VersionNumber...

    dll文件编辑器.exe dll.edit.zip

    3. **版本信息更新**:修改DLL的版本信息,确保与其他程序的兼容性。 4. **优化与压缩**:优化代码,减少DLL大小,提高执行效率。 `dll.file.editor.exe` 这个编辑器可能提供的功能包括: - **代码查看和编辑**:...

    dll型内存补丁生成器.exe

    dll型内存补丁生成器.exe

    自动获取svn版本号,修改指定dll,exe版本信息

    自动获取工程svn提交的版本号,然后修改指定dll,exe的版本信息。最好达到的效果是,每次提交完svn后重新编译代码,会将最后提交的版本号写到version里比如:2.0.0.64,;2.0是大版本号,手动修改资源信息即可,后两...

    取得dll、exe文件的版本信息,,,,

    要获取DLL或EXE文件的版本信息,可以使用Windows API函数`GetFileVersionInfo`和相关的API调用。以下是详细的步骤和知识点: 1. **获取文件版本信息的API**: - `GetFileVersionInfoSize`:此函数用于获取文件版本...

Global site tag (gtag.js) - Google Analytics