为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

相关文章

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(

PHP执行php.exe -v命令报错的解决方案

《PHP执行php.exe-v命令报错的解决方案》:本文主要介绍PHP执行php.exe-v命令报错的解决方案,文中通过图文讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录执行phpandroid.exe -v命令报错解决方案执行php.exe -v命令报错-PHP War

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

什么是dll

DLL的概念        DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使

用VB创建开始菜单快捷方式(无需其他DLL)

Option Explicit   Private Sub Command1_Click()   CreateProgManGroup Me, "测试", "test.grp"   CreateProgManItem Me, "d:\ghost.exe", "Ghost"   CreateProgManItem Me, "d:\setupQQ.exe", "QQ"   End

收藏:解决 pip install 出现 error: subprocess-exited-with-error 错误的方法

在使用 pip 安装 Python 包时,有时候会遇到 error: subprocess-exited-with-error 错误。这种错误通常是由于 setuptools 版本问题引起的。本文将介绍如何解决这一问题 当你使用 pip install 安装某个 Python 包时,如果 setuptools 版本过高或过低,可能会导致安装过程出错,并出现类似以下错误信息:error: subpr

如何用MyEclipse生成jar文件和exe4j生成.exe

首先新建一个文件夹,文件名自定,为了使没有安装jre的用户,也可以运行这个exe文件,先把安装的java下面的jre复制到这文件夹中, 1.先用MyEclipse生成jar文件,步骤如下: 右击项目名——选择Export——java——JAR file——点击“Next”——填一下地址(JAR file,存放在刚才新建的文件夹里面,路径就是这个)——点击“Next”——在点击“Next”——点

Java中WebService接口的生成、打包成.exe、设置成Windows服务、及其调用、Apache CXF调用

一、Java中WebService接口的生成: 1、在eclipse工具中新建一个普通的JAVA项目,新建一个java类:JwsServiceHello.java package com.accord.ws;import javax.jws.WebMethod;import javax.jws.WebService;import javax.xml.ws.Endpoint;/*** Ti

将 python 文件打包为exe文件

可以使用 PyInstaller 来将 Python 文件打包为可执行的 .exe 文件。以下是基本的步骤: 安装 PyInstaller: pip install pyinstaller 打包 Python 文件: 在终端中运行以下命令: pyinstaller --onefile your_script.py –onefile 选项将所有文件打包到一个 .exe 文件中。 找