VS_VERSION_INFO resource

本文介绍了一种从VS_VERSION_INFO资源中获取应用程序版本的方法。通过创建按钮并添加GetApplicationVersion()函数,利用Version.lib库,可以轻松读取并显示EXE文件的版本信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

During your programing , you could meet how to get your application's version sometimes,now I will tell you how to get the application's version from the VS_VERSION_INFO resource.


First ,you should make a project named GetVersion from MFC Appwizard(exe) depends on dialog!


Next, we create a button control  named IDC_BTN_GETVERSION, it uses to get the application function.In this button, we add the function named GetApplicationVersion(), it uses to get the application's version!


Before Add the function , we should add a library named Version.lib, code just like:


#pragma comment(lib,"Version.lib")


Now , we Add the function named GetApplicationVersion(), and no return value,just void prefix.


This function's code ,as follows :


 TCHAR szFullPath[MAX_PATH];
 DWORD dwVerInfoSize = 0;
 DWORD dwVerHnd;
 VS_FIXEDFILEINFO * pFileInfo;


 GetModuleFileName(NULL, szFullPath, sizeof(szFullPath));
    dwVerInfoSize = GetFileVersionInfoSize(szFullPath, &dwVerHnd);
    if (dwVerInfoSize)
    {
        // If we were able to get the information, process it:
        HANDLE  hMem;
        LPVOID  lpvMem;
  unsigned int uInfoSize = 0;
  
        hMem = GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize);
        lpvMem = GlobalLock(hMem);
        GetFileVersionInfo(szFullPath, dwVerHnd, dwVerInfoSize, lpvMem);


  ::VerQueryValue(lpvMem, (LPTSTR)_T("\\"), (void**)&pFileInfo, &uInfoSize);


  WORD m_nProdVersion[4];
  
  // Product version from the FILEVERSION of the version info resource 
  m_nProdVersion[0] = HIWORD(pFileInfo->dwProductVersionMS); 
  m_nProdVersion[1] = LOWORD(pFileInfo->dwProductVersionMS);
  m_nProdVersion[2] = HIWORD(pFileInfo->dwProductVersionLS);
  m_nProdVersion[3] = LOWORD(pFileInfo->dwProductVersionLS); 


  CString strVersion ;
  strVersion.Format(_T("The file's version : %d.%d.%d.%d"),m_nProdVersion[0],
                  m_nProdVersion[1],m_nProdVersion[2],m_nProdVersion[3]);
  
  GlobalUnlock(hMem);
        GlobalFree(hMem);


  AfxMessageBox(strVersion);


}


It's very easy,do not you think ?


compile:


VC6.0 + VSP6 + WINXP!
<think>嗯,用户现在想了解MFC如何将VS_VERSION_INFO资源写入到exe文件中。我之前已经回答过关于#pragma comment链接器指令的问题,现在需要结合用户提供的引用内容,但看起来引用中的内容可能不太相关。用户提到了ExitInstance()和CFontDialog,但这些可能和版本信息资源的处理关系不大。不过,用户可能是在之前的对话中提到了MFC的基本用法和资源管理,所以需要结合MFC的资源机制来回答。 首先,VS_VERSION_INFO是Windows程序中用来存储版本信息的资源,通常包括文件版本、产品版本、公司名称、版权信息等。在MFC项目中,这个资源通常通过.rc文件来定义,然后资源编译器将其编译进exe文件中。用户可能想知道MFC是如何处理这个资源的,以及具体的实现步骤。 用户提供的引用[1]提到了在卸载函数中加入ExitInstance(),这可能涉及到MFC应用程序的生命周期管理,但和版本信息资源的写入可能没有直接关系。引用[2]讨论了CFontDialog类的使用,这似乎与资源文件无关。但用户可能希望我参考之前的回答结构,即详细分点解释机制和实现方式,并生成相关问题。 我需要确认MFC中VS_VERSION_INFO资源的处理流程。通常,在Visual Studio中创建MFC项目时,会自动生成.rc文件,其中包含VS_VERSION_INFO资源块。开发人员可以通过资源编辑器修改这些信息,构建时资源编译器会将信息编译到exe的资源段中。此外,MFC可能提供了一些封装类或宏来简化操作,但核心还是依赖于Windows的资源机制。 需要详细说明如何手动编辑.rc文件中的版本信息,以及如何通过资源编辑器进行可视化修改。同时,可能还要提到在代码中如何访问这些版本信息,比如使用GetFileVersionInfo等API函数。此外,需要注意版本信息资源的结构,如VS_FIXEDFILEINFO结构体,以及如何确保资源正确嵌入到exe中。 可能用户在实际操作中遇到了版本信息没有正确显示的问题,需要检查资源是否正确定义,或者构建过程中是否有错误。另外,是否需要调用某些MFC特定的函数或宏来更新资源,或者在项目设置中配置版本信息。 总结来说,回答需要分点讲解VS_VERSION_INFO资源的作用、在MFC中的实现步骤(资源编辑、编译过程)、访问方式,以及常见问题处理。同时生成相关问题,比如如何动态读取版本信息,如何自动生成版本号,或者如何处理多语言版本的资源等。</think>### MFC中VS_VERSION_INFO资源写入EXE的机制及实现 在MFC应用程序中,`VS_VERSION_INFO`资源用于存储**文件版本、产品名称、版权信息**等元数据,其写入过程通过 **Windows资源编译器+链接器协作** 完成。以下是具体实现机制: --- #### 一、资源定义核心机制 1. **资源脚本(.rc文件)** - 在项目资源文件(如`YourProject.rc`)中通过`VS_VERSION_INFO`块定义版本信息: ```rc VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,0,1 PRODUCTVERSION 1,0,0,1 FILEFLAGSMASK 0x3fL FILEFLAGS 0x0L FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "CompanyName", "Eastmount\0" VALUE "FileVersion", "1.0.0.1\0" VALUE "LegalCopyright", "© 2024 Eastmount\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x0409, 1200 END END ``` - `FILEVERSION`/`PRODUCTVERSION`:四段式版本号(Major.Minor.Build.Revision) - `StringFileInfo`:本地化字符串信息(如公司名、版权声明) - `VarFileInfo`:定义字符集和语言ID(如`0x0409`表示英语,`1200`表示Unicode)[^1][^2] 2. **资源编译器处理** - Visual Studio构建时,`rc.exe`将`.rc`文件编译为`.res`二进制资源文件 - 资源中包含的`VS_VERSION_INFO`会被编码为**RESOURCE**类型的二进制数据块[^1] 3. **链接器嵌入** - 链接器(`link.exe`)将`.res`文件与代码生成的`.obj`文件合并,最终将版本信息写入PE文件格式的**资源节(.rsrc)**[^2] --- #### 二、MFC框架中的增强支持 1. **版本信息宏** - MFC提供`VER_FILEVERSION`/`VER_PRODUCTVERSION`等宏简化版本号定义: ```cpp #define VER_FILEVERSION 1,0,0,1 #define VER_PRODUCTVERSION 1,0,0,1 ``` - 这些宏会被资源编译器自动解析到`VERSIONINFO`资源块[^1] 2. **自动生成机制** - 通过项目属性页设置版本信息(*项目属性 > 配置属性 > 常规*): - 文件版本、产品版本 - 版权信息、公司名称等 - Visual Studio会自动同步这些值到`rc`文件 --- #### 三、代码验证与调试 1. **运行时读取验证** - 使用Windows API验证资源是否正确嵌入: ```cpp DWORD dwHandle; DWORD dwSize = GetFileVersionInfoSize(_T("YourApp.exe"), &dwHandle); if (dwSize > 0) { LPBYTE lpData = new BYTE[dwSize]; GetFileVersionInfo(_T("YourApp.exe"), dwHandle, dwSize, lpData); // 解析版本信息... } ``` 2. **常见问题排查** - **问题**:修改版本号后EXE属性未更新 - **原因**:资源未重新编译(清理解决方案后重新生成) - **解决方案**:检查`.rc`文件是否被意外修改,确保资源编译器无报错[^1] --- ### 相关问题 1. 如何通过代码动态修改已编译EXE的版本信息? 2. MFC中如何实现多语言版本的VS_VERSION_INFO资源? 3. 为什么某些杀毒软件会误报包含版本信息的EXE文件?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值