如何修改.exe的文件版本以及产品版本

本文教你如何使用ResourceHacker工具修改exe文件的版本信息,包括Company Name、Product Version等,步骤包括反编译、修改内容并保存,最后通过对比原文件确认修改效果。

如何修改一个exe的文件版本以及产品版本

效果之前的效果

图片.png

修改之后的效果

图片.png

下载一个反编译工具

Resource Hacker (angusj.com)

图片.png 下载好之后双击运行就好了。

图片.png

修改信息

  1. 将exe拖到对应的位置,

图片.png 2. 将程序反编译出来

图片.png 3. 修改版本信息

图片.png 上面的信息说明(来自有道翻译)

| 英文 |中文 | | --- | --- | | Comments| 评论,说明 | |CompanyName | 公司名称| | FileDescription|文件描述 | | FileVersion|文件版本 | |InternalName |内部名称 | |LegalCopyright |著作权 | |LegalTrademarks | 合法商标| |OriginalFilename| 源文件名称| | ProductName|产品名称 | |ProductVersion | 产品版本| | Assembly Version| 组装版本|

  1. 修改完成之后 运行然后保存

图片.png

检查

会有一个“程序名”+_"original"的文件出现,那个是之前的文件。 右键查看属性来确认是否修改完成。

运行

双击新的exe就会运行程序。

Enjoy

<think>好的,用户之前询问过如何在VS2010中使用C语言获取.exe文件版本信息,我已经给出了详细的代码示例和步骤。现在用户再次提问,看起来可能是在确认之前的方法,或者遇到了具体实施中的问题。需要结合用户提供的引用内容来调整回答,但引用中的内容主要涉及读取ASCII和CSV文件,以及exit函数的使用,似乎和版本信息获取关系不大。不过用户可能希望看到类似文件操作的方法,比如如何处理文件路径或错误。 首先,用户的问题还是关于获取exe版本信息,所以需要确认之前的回答是否足够。用户提供的引用中提到exit函数需要stdlib.h,这可能提示在代码中是否需要包含该头文件。之前的示例代码中没有使用exit,但如果在错误处理时需要终止程序,可能需要添加。另外,用户提到的CSV文件读取可能与文件处理相关,但当前问题不涉及,所以可能不需要考虑。 需要检查之前的代码示例是否存在潜在问题,比如路径处理、宽字符支持等。用户提到在VS2010中使用C语言,所以需要考虑编译器的兼容性,比如变量长度数组(VLA)是否支持。在之前的代码中,使用了char verData[verSize],这在C99中是允许的,但VS2010的C编译器可能不支持VLA,这可能导致编译错误。因此,需要修改代码使用动态内存分配,比如malloc和free,来替代VLA。 另外,用户引用的内容提到exit函数,可能在错误处理时需要调用exit,但原代码中使用return,是否需要调整?原代码中的错误处理只是打印错误并返回,可能用户希望更严格的错误处理,比如退出程序。因此,可以建议在错误时使用exit(1)并包含stdlib.h。 此外,用户可能遇到路径问题,特别是中文字符路径,之前的注意事项中提到使用宽字符版本API,但示例代码中使用的是GetFileVersionInfoA,可能需要改为GetFileVersionInfoW,并使用wchar_t路径,以支持Unicode路径。 综上,需要调整代码示例,解决VLA的问题,添加错误处理中的exit,并考虑宽字符路径的支持。同时,确保包含必要的头文件,如stdlib.h,并链接正确的库。可能还需要指导用户如何在VS2010中配置项目属性,添加Version.lib作为依赖项。 最后,确保回答结构清晰,步骤明确,注意事项覆盖用户可能遇到的问题,如编译器兼容性、路径处理、错误终止等。</think>在Visual Studio 2010中使用C语言读取EXE文件版本信息,需通过Windows API实现。以下是针对VS2010环境优化的完整方案: ### 实现步骤(兼容VS2010编译器) 1. **包含必要头文件** ```c #include <windows.h> #include <stdio.h> #include <stdlib.h> // 用于exit函数[^1] ``` 2. **动态内存分配**(解决VLA兼容性问题) ```c void GetVersionInfo(LPCSTR filePath) { DWORD verHandle; DWORD verSize = GetFileVersionInfoSizeA(filePath, &verHandle); if (verSize == 0) { printf("获取文件大小失败,错误码: %d\n", GetLastError()); exit(1); // 使用exit终止程序[^1] } BYTE* verData = (BYTE*)malloc(verSize); // 动态内存分配 if (!GetFileVersionInfoA(filePath, verHandle, verSize, verData)) { free(verData); printf("获取版本信息失败,错误码: %d\n", GetLastError()); exit(1); } // ...后续处理 free(verData); // 释放内存 } ``` 3. **宽字符支持**(处理含中文路径) ```c void GetVersionInfoW(LPCWSTR filePath) { DWORD verHandle; DWORD verSize = GetFileVersionInfoSizeW(filePath, &verHandle); if (verSize == 0) { wprintf(L"错误:无法获取文件大小\n"); exit(1); } // ...类似ANSI版本实现,使用W后缀函数 } ``` ### 完整代码示例 ```c #include <windows.h> #include <stdio.h> #include <stdlib.h> void GetProductVersion(LPCSTR filePath) { DWORD verHandle = 0; DWORD verSize = GetFileVersionInfoSizeA(filePath, &verHandle); if (verSize == 0) { printf("错误: %d\n", GetLastError()); exit(EXIT_FAILURE); } BYTE* verData = (BYTE*)malloc(verSize); if (!GetFileVersionInfoA(filePath, verHandle, verSize, verData)) { free(verData); printf("错误: %d\n", GetLastError()); exit(EXIT_FAILURE); } UINT transLen; VS_FIXEDFILEINFO* fileInfo; if (VerQueryValueA(verData, "\\", (LPVOID*)&fileInfo, &transLen)) { printf("文件版本: %d.%d.%d.%d\n", HIWORD(fileInfo->dwFileVersionMS), LOWORD(fileInfo->dwFileVersionMS), HIWORD(fileInfo->dwFileVersionLS), LOWORD(fileInfo->dwFileVersionLS)); } free(verData); } int main() { GetProductVersion("C:\\YourProgram.exe"); // 注意转义路径分隔符 return 0; } ``` ### 项目配置要点 1. **库文件配置** - 项目属性 → 链接器 → 输入 → 附加依赖项添加`Version.lib` 2. **字符集设置** - 项目属性 → 常规 → 字符集: - 使用`GetFileVersionInfoA`时设为`多字节字符集` - 使用`GetFileVersionInfoW`时设为`Unicode字符集` ### 关键改进说明 1. **内存管理**:使用`malloc/free`替代VLA,兼容VS2010的C89/C90标准 2. **错误处理**:使用`exit(EXIT_FAILURE)`替代直接返回[^1] 3. **版本信息扩展**:同时获取`VS_FIXEDFILEINFO`结构中的文件版本号 4. **路径支持**:提供宽字符版本函数处理特殊字符路径 ### 典型输出示例 ``` 文件版本: 1.2.3.4 产品版本: 2024.06.1.0 ``` --相关问题-- 1. 如何获取EXE文件的数字签名信息? 2. Windows资源文件中`VS_VERSION_INFO`结构包含哪些关键字段? 3. 如何通过C语言实现版本信息的比较(如判断1.2.3是否大于1.1.9)?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值