《Windows API巡礼》---GetFileVersionInfo函数和VerQueryValue函数

2024-04-24 22:32

本文主要是介绍《Windows API巡礼》---GetFileVersionInfo函数和VerQueryValue函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

VS_FIXEDFILEINFO结构包含了文件的版本信息:

  1. typedef struct tagVS_FIXEDFILEINFO {  
  2.   DWORD dwSignature; //包含的值是0xFEEF04BD   
  3.   DWORD dwStrucVersion; //该结构的32位二进制版本号,高16位是主版本号,低16位是副版本号   
  4.   DWORD dwFileVersionMS; //该文件二进制版本号的高32bits   
  5.   DWORD dwFileVersionLS; //该文件二进制版本号的低32bits   
  6.   DWORD dwProductVersionMS; //发布该文件的产品二进制版本号高32bits   
  7.   DWORD dwProductVersionLS; //发布该文件的产品二进制版本号低32bits   
  8.   DWORD dwFileFlagsMask; //比特掩码,标志dwFileFlags的有效位   
  9.   DWORD dwFileFlags; //VS_FF_DEBUG---该文件包含调试信息或是由调试版编译的   
  10.                              //VS_FF_INFOINFERRED---文件的版本结构是动态创建的,   
  11. //因此,该结构中有的成员是空的或不正确的   
  12.                              //VS_FF_PATCHED---该文件被修改过   
  13.                              //VS_FF_PRERELEASE---该文件是开发版,不是商业发布版   
  14.                              //VS_FF_PRIVATEBUILD---该文件不是由标准发布步骤构建的   
  15.                              //VS_FF_SPECIALBUILD---该文件是由标准发布步骤构建的,   
  16. //但是相同版本号文件的变种   
  17.   DWORD dwFileOS; //该文件设计用于的操作系统   
  18.   DWORD dwFileType; //文件类型:VFT_APP---文件包含一个应用程序   
  19.                                            VFT_DLL---文件包含一个DLL  
  20.                                            VFT_DRV---文件包含一个设备驱动  
  21.                                            VFT_FONT---文件包含一个字体文件  
  22.                                            VFT_STATIC_LIB---文件包含一个静态链接库  
  23.                                            VFT_UNKNOWN---文件类型未知  
  24.                                            VFT_VXD---文件包含一个虚拟设备  
  25.   DWORD dwFileSubtype; //文件的子类型,由dwFileType决定   
  26.   DWORD dwFileDateMS; //二进制文件创建日期和时间戳的高32bits   
  27.   DWORD dwFileDateLS; //二进制文件创建日期和时间戳的低32bits   
  28. } VS_FIXEDFILEINFO;  

GetFileVersionInfoSize函数用于判断系统能否检索到指定文件的版本信息,如果可以,函数返回版本信息的字节大小:

  1. DWORD WINAPI GetFileVersionInfoSize(  
  2.   __in       LPCTSTR lptstrFilename, //指定文件的名称   
  3.   __out_opt  LPDWORD lpdwHandle //一个变量的指针,该函数将该变量设为0   
  4. );  

GetFileVersionInfo函数用来获得指定文件的版本信息:

  1. BOOL WINAPI GetFileVersionInfo(  
  2.   __in        LPCTSTR lptstrFilename, //文件名   
  3.   __reserved  DWORD dwHandle, //保留值   
  4.   __in        DWORD dwLen, //lpData指向缓冲区的大小,使用函数GetFileVersionInfoSize得到   
  5.   __out       LPVOID lpData //指向存放文件版本信息的缓冲区的指针   
  6. );  

VerQueryValue函数用于从指定的版本信息源获取版本信息,在调用该函数之前,需要先依次调用函数GetFileVersionInfoSizeGetFileVersionInfo

上面参数lpSubBlock取值中的string-name必须是下面系统预定义的字符串之一:

下面代码实例封装了一个文件版本信息类,使用上面介绍的函数方便地获取文件版本信息,头文件定义如下FileVersion.h: 

  1. // FileVersion.h: interface for the CFileVersion class.   
  2. // by Manuel Laflamme   
  3. //   
  4. #ifndef __FILEVERSION_H_   
  5. #define __FILEVERSION_H_   
  6. #if _MSC_VER >= 1000   
  7. #pragma once   
  8. #endif // _MSC_VER >= 1000   
  9. class CFileVersion  
  10. {   
  11. // Construction   
  12. public:   
  13.     CFileVersion();  
  14. // Operations      
  15. public:   
  16.     BOOL    Open(LPCTSTR lpszModuleName);  
  17.     void    Close();  
  18.     CString QueryValue(LPCTSTR lpszValueName, DWORD dwLangCharset = 0);  
  19.     CString GetFileDescription()  {return QueryValue(_T("FileDescription")); };  
  20.     CString GetFileVersion()      {return QueryValue(_T("FileVersion"));     };  
  21.     CString GetInternalName()     {return QueryValue(_T("InternalName"));    };  
  22.     CString GetCompanyName()      {return QueryValue(_T("CompanyName"));     };   
  23.     CString GetLegalCopyright()   {return QueryValue(_T("LegalCopyright"));  };  
  24.     CString GetOriginalFilename() {return QueryValue(_T("OriginalFilename"));};  
  25.     CString GetProductName()      {return QueryValue(_T("ProductName"));     };  
  26.     CString GetProductVersion()   {return QueryValue(_T("ProductVersion"));  };  
  27.     BOOL    GetFixedInfo(VS_FIXEDFILEINFO& vsffi);  
  28.     CString GetFixedFileVersion();  
  29.     CString GetFixedProductVersion();  
  30. // Attributes   
  31. protected:  
  32.     LPBYTE  m_lpVersionData;   
  33.     DWORD   m_dwLangCharset;   
  34. // Implementation   
  35. public:  
  36.     ~CFileVersion();   
  37. };   
  38. #endif  // __FILEVERSION_H_  

头文件的实现如下FileVersion.cpp:

  1. // FileVersion.cpp: implementation of the CFileVersion class.   
  2. // by Manuel Laflamme    
  3. //   
  4. #include "FileVersion.h"   
  5. #pragma comment(lib, "version")   
  6. #ifdef _DEBUG   
  7. #undef THIS_FILE   
  8. static char THIS_FILE[]=__FILE__;  
  9. #define new DEBUG_NEW   
  10. #endif   
  11. //   
  12. CFileVersion::CFileVersion()   
  13. {   
  14.     m_lpVersionData = NULL;  
  15.     m_dwLangCharset = 0;  
  16. }  
  17. CFileVersion::~CFileVersion()   
  18. {   
  19.     Close();  
  20. }   
  21. void CFileVersion::Close()  
  22. {  
  23.     delete[] m_lpVersionData;   
  24.     m_lpVersionData = NULL;  
  25.     m_dwLangCharset = 0;  
  26. }  
  27. BOOL CFileVersion::Open(LPCTSTR lpszModuleName)  
  28. {  
  29.     ASSERT(_tcslen(lpszModuleName) > 0);  
  30.     ASSERT(m_lpVersionData == NULL);  
  31.     // Get the version information size for allocate the buffer   
  32.     DWORD dwHandle;       
  33.     DWORD dwDataSize = ::GetFileVersionInfoSize((LPTSTR)lpszModuleName, &dwHandle);   
  34.     if ( dwDataSize == 0 )   
  35.         return FALSE;  
  36.     // Allocate buffer and retrieve version information   
  37.     m_lpVersionData = new BYTE[dwDataSize];   
  38.     if (!::GetFileVersionInfo((LPTSTR)lpszModuleName, dwHandle, dwDataSize,   
  39.                               (void**)m_lpVersionData) )  
  40.     {  
  41.         Close();  
  42.         return FALSE;  
  43.     }  
  44.     // Retrieve the first language and character-set identifier   
  45.     UINT nQuerySize;  
  46.     DWORD* pTransTable;  
  47.     if (!::VerQueryValue(m_lpVersionData, _T("\\VarFileInfo\\Translation"),  
  48.                          (void **)&pTransTable, &nQuerySize) )  
  49.     {  
  50.         Close();  
  51.         return FALSE;  
  52.     }  
  53.     // Swap the words to have lang-charset in the correct format   
  54.     m_dwLangCharset = MAKELONG(HIWORD(pTransTable[0]), LOWORD(pTransTable[0]));  
  55.     return TRUE;  
  56. }  
  57. CString CFileVersion::QueryValue(LPCTSTR lpszValueName,   
  58.                                  DWORD dwLangCharset /* = 0*/)  
  59. {  
  60.     // Must call Open() first   
  61.     ASSERT(m_lpVersionData != NULL);  
  62.     if ( m_lpVersionData == NULL )  
  63.         return (CString)_T("");  
  64.     // If no lang-charset specified use default   
  65.     if ( dwLangCharset == 0 )  
  66.         dwLangCharset = m_dwLangCharset;  
  67.     // Query version information value   
  68.     UINT nQuerySize;  
  69.     LPVOID lpData;  
  70.     CString strValue, strBlockName;  
  71.     strBlockName.Format(_T("\\StringFileInfo\\%08lx\\%s"),   
  72.                          dwLangCharset, lpszValueName);  
  73.     if ( ::VerQueryValue((void **)m_lpVersionData, strBlockName.GetBuffer(0),   
  74.                          &lpData, &nQuerySize) )  
  75.         strValue = (LPCTSTR)lpData;  
  76.     strBlockName.ReleaseBuffer();  
  77.     return strValue;  
  78. }  
  79. BOOL CFileVersion::GetFixedInfo(VS_FIXEDFILEINFO& vsffi)  
  80. {  
  81.     // Must call Open() first   
  82.     ASSERT(m_lpVersionData != NULL);  
  83.     if ( m_lpVersionData == NULL )  
  84.         return FALSE;  
  85.     UINT nQuerySize;  
  86.     VS_FIXEDFILEINFO* pVsffi;  
  87.     if ( ::VerQueryValue((void **)m_lpVersionData, _T("//"),  
  88.                          (void**)&pVsffi, &nQuerySize) )  
  89.     {  
  90.         vsffi = *pVsffi;  
  91.         return TRUE;  
  92.     }  
  93.     return FALSE;  
  94. }  
  95. CString CFileVersion::GetFixedFileVersion()  
  96. {  
  97.     CString strVersion;  
  98.     VS_FIXEDFILEINFO vsffi;  
  99.     if ( GetFixedInfo(vsffi) )  
  100.     {  
  101.         strVersion.Format (_T("%u,%u,%u,%u"),HIWORD(vsffi.dwFileVersionMS),  
  102.             LOWORD(vsffi.dwFileVersionMS),  
  103.             HIWORD(vsffi.dwFileVersionLS),  
  104.             LOWORD(vsffi.dwFileVersionLS));  
  105.     }  
  106.     return strVersion;  
  107. }  
  108. CString CFileVersion::GetFixedProductVersion()  
  109. {  
  110.     CString strVersion;  
  111.     VS_FIXEDFILEINFO vsffi;  
  112.     if ( GetFixedInfo(vsffi) )  
  113.     {  
  114.         strVersion.Format (_T("%u,%u,%u,%u"), HIWORD(vsffi.dwProductVersionMS),  
  115.             LOWORD(vsffi.dwProductVersionMS),  
  116.             HIWORD(vsffi.dwProductVersionLS),  
  117.             LOWORD(vsffi.dwProductVersionLS));  
  118.     }  
  119.     return strVersion;  
  120. }  

这篇关于《Windows API巡礼》---GetFileVersionInfo函数和VerQueryValue函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/933017

相关文章

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

java中BigDecimal里面的subtract函数介绍及实现方法

《java中BigDecimal里面的subtract函数介绍及实现方法》在Java中实现减法操作需要根据数据类型选择不同方法,主要分为数值型减法和字符串减法两种场景,本文给大家介绍java中BigD... 目录Java中BigDecimal里面的subtract函数的意思?一、数值型减法(高精度计算)1.

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

Windows 系统下 Nginx 的配置步骤详解

《Windows系统下Nginx的配置步骤详解》Nginx是一款功能强大的软件,在互联网领域有广泛应用,简单来说,它就像一个聪明的交通指挥员,能让网站运行得更高效、更稳定,:本文主要介绍W... 目录一、为什么要用 Nginx二、Windows 系统下 Nginx 的配置步骤1. 下载 Nginx2. 解压

windows系统上如何进行maven安装和配置方式

《windows系统上如何进行maven安装和配置方式》:本文主要介绍windows系统上如何进行maven安装和配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. Maven 简介2. maven的下载与安装2.1 下载 Maven2.2 Maven安装2.

使用Python实现Windows系统垃圾清理

《使用Python实现Windows系统垃圾清理》Windows自带的磁盘清理工具功能有限,无法深度清理各类垃圾文件,所以本文为大家介绍了如何使用Python+PyQt5开发一个Windows系统垃圾... 目录一、开发背景与工具概述1.1 为什么需要专业清理工具1.2 工具设计理念二、工具核心功能解析2.