Delphi 版本信息获取函数 GetFileVersionInfo、GetFileVersionInfoSize、VerFindFile、VerInstallFile和VerQueryValue
一、版本信息获取函数简介和作用
获取文件版本信息的作用:
1. 避免在新版本的组件上安装旧版本的相同组件;
2. 在多语言系统环境中,操作系统根据文件版本信息里提供的语言信息在启动程序时决定使用的正确语言;
3. 防止在不同的路径下安装多个文件的拷贝;
4. 应用程序在运行时,便能判断文件的版本是否正确;
5. 在应用程序的关于对话框中显示可执行文件的版本号;
6. 在线升级程序可以判断一个文件是否因为版本过旧,从而进行必要的文件升级。
Windows系统通过API(可编程接口)的方式为软件开发人员提供了管理版本信息的方法。API函数有GetFileVersionInfo、GetFileVersionInfo、VerFindFile、VerInstallFile和VerQueryValue,它们被存放在Windows系统目录下一个被命名为VERSION.DLL的动态链接库文件中。
在Windows系统中任何可以包含Windows资源的文件都可以包含版本信息,比如动态链接库文件、可执行文件、字体文件等。版本信息被包装成一个VERSIONINFO结构的资源,通过编译器打包进这些文件中。
GetFileVersionInfo 函数被用来获取包含在指定文件中的版本信息。其函数声明如下:
function GetFileVersionInfo(
lptstrFilename: PChar; // 文件名
dwHandle: DWORD; // 忽略
dwLen: DWORD; // 缓冲区大小
lpData: Pointer // 版本信息缓冲区
): BOOL; stdcall;
参数说明:
lptstrFilename,一个以NULL结束字符串,它指定了期望从中获取版本详细的文件名。如果文件名不包含完整路径,函数将使用LoadLibrary函数的默认搜索次序进行搜索。在Windows 95/98/Me操作系统中路径名不能超过126个字符。
dwHandle,这个参数没有使用,将被忽略。
dwLen,请先调用GetFileVersionInfoSize函数确定文件版本信息的字节数大小。dwLen必须等于或大于这个值。如果lpDate指向的缓冲区空间不够,函数将根据实际大小裁减出文件的版本信息。
lpData,指向一个用于保存函数调用后返回的文件版本信息的缓冲区。
如果函数调用成功,它将返回True;否则返回False。可通过GetLastError函数得到扩展的错误信息。
在调用GetFileVersionInfo函数前必须先调用GetFileVersionFileSize。为了从文件版本信息中获取有用信息,必须使用VerQueryValue函数。
GetFileVersionInfoSize函数被用来判断操作系统是否能够从指定文件中获取版本信息。如果存在版本信息,便返回以字节为单位的这些信息所占用空间的大小。其Delphi函数声明如下:
function GetFileVersionInfoSize(
lptstrFilename: PChar; // 文件名
var lpdwHandle: DWORD // set to zero
): DWORD; stdcall;
参数说明:
lptstrFilename,一个以NULL结束字符串,它指明期望从哪个文件中获取版本信息的文件名。
lpdwHandle,一个指向将被函数设置为0的变量的指针。
函数调用成功,它将返回文件版本信息的字节大小;否则返回0,可通过GetLastError函数得到扩展的错误信息。
在调用GetFileVersionInfo函数前应先调用GetFileVersionInfoSize函数。GetFileVersionInfoSize函数的返回值确定了GetFileVersionInfo函数所使用的版本信息缓冲区的大小。
VerLanguagename函数被用来获取与指定的二进制微软语言标示相关联的语言描述字符串。其Delphi函数声明如下:
function VerLanguageName(
wLang: DWORD; // 微软语言标识符
szLang: PChar; // 语言描述缓冲区
nSize: DWORD // 缓冲区大小
): DWORD; stdcall;
参数说明:
wLang,语言标识符,是一个二进制数字。指定二进制语言标识符。如果向得到完整的语言标识符列表,请参见语言标识符部分的内容。举个例子,与语言标识符0x040A相关联的描述字符串就是“卡斯蒂利亚西班牙语”。如果是一个未知的标识符,那么szLang参数就会指向一个缺省字符串--“Language Neutral”。
szLang,这个参数指向一个缓冲区。这个缓冲区用于存储由wLang参数所确定的、用来描述语言的、以NULL结尾的字符串。
nSize 指定缓冲区的大小,单位是字符数量。
函数将返回存储在缓冲区中字符串的以字符为单位的大小。返回值不包含结束NULL字符。如果描述字符串小于或等于缓冲区的大小,那么整个描述字符串将保存在这个缓冲区中;否则,缓冲区中将之保留描述字符串的前面大小等于缓冲区大小的部分。
如果发生错误,返回值将等于0。未知的语言标识符不会产生错误。
通常,安装程序通过这个函数来翻译从VarQuery函数返回的语言标识符。当出现语言冲突的时候,这个得到的文本字符串便可以用在一个向用户询问怎样处理的对话框中,提示用户进行处理。
VerQueryValue函数被用来从指定的版本信息资源中获取指定版本信息。最常用的获取版本信息的逻辑流程是:先调用GetFileVersionInfoSize函数,紧接着再调用GetFileVersionInfo函数,最后再调用VerQueryValue函数。其Delphi函数声明如下:
function VerQueryValue(
pBlock: Pointer; // 存放版本资源的缓冲区
lpSubBlock: PChar; // 期望获取的值
var lplpBuffer: Pointer; // 指向存放版本值缓冲区的指针
var puLen: UINT // 版本信息长度
): BOOL; stdcall;
参数说明:
pBlock,一个指向用于存储版本信息资源的缓冲区的指针,这个版本信息资源是从GetFileVersionInfo函数返回的。
lpSubBlock,指向一个零结尾的字符串,指定到底获得哪个版本信息值。这个字符串必须由被反斜线符号(\)分开的名字组成如下格式之一:
→“\”,指定根区域。函数将返回一个指向VS_FIXEDFIELDFILEINFO结构的版本信息资源。
→“\VarFileInfo\Translation”,指定一个保存在可变类型变量信息的结构中的转换阵列。函数返回一个指向语言和代码页标识符数组的指针。应用程序可以使用这些标识符来访问存储在版本信息资源中的特定语言字符串表结构。
→“\StringFileInfo\lang-codepage\string-name”,指定存储在特定语言字符串表中结构的值。其中,lang-codepage的书写格式是:用双字(DWORD)表示的、保存在资源中的转换阵列的语言与代码页标识符对,并且需要书写成十六进制形式的字符串;string-name必须是在后面注释中预定义的字符串之一。函数根据指定的语言与代码页,返回一个与之相关的字符串。
lplpBuffer,一个指向用于保存指向被请求的版本信息缓冲区的变量的指针。简单的说,就是一个指向指针的指针。
puLen,指向一个保存版本信息长度的缓冲区。
如果指定的版本信息结构存在并且有效,函数将返回一个非0值。如果长度缓冲区的地址等于0,指定的版本信息名称将无效。
并且,在指定的名称不存在或指定的资源无效时,函数的返回值将等于0。
以下列表是预定义的版本信息统一字符编码标准字符串:
Comments、InternalName、ProductName、CompanyName、LegalCopyright、ProductVersion、FileDescription、LegalTrademarks、PrivateBuild、FileVersion、OriginalFilename、SpecialBuild
二、函数使用实例
在Delphi的集成编辑器中按下Shift+Ctrl+F11键,在弹出的对话框中按照下表的内容,在相应键值的未知输入内容:
例如:“产品名称”、“产品版本号”、“文件说明”、“产品合法商标”、“运行文件版本号”、“公司名称”、“合法商标”、“产品内部名称”、“原文件名”等
代码示例:
- const
- InfoNum = 9;
- InfoStr: array[1..InfoNum] of string = (
- 'ProductName',
- 'ProductVersion',
- 'FileDescription',
- 'LegalCopyright',
- 'FileVersion',
- 'CompanyName',
- 'LegalTradeMarks',
- 'InternalName',
- 'OriginalFileName'
- );
- var
- S: string;
- BufSize, Len: DWORD;
- Buf: PChar;
- Value: PChar;
- begin
- S := Application.ExeName;
- BufSize := GetFileVersionInfoSize(PChar(S), BufSize);
- if BufSize > 0 then begin
- Buf := AllocMem(BufSize); //获取内存控件,用于保存从文件中获得的版本信息资源。
- GetFileVersionInfo(PChar(S), 0, BufSize, Buf); //获得在内存中存储版本信息资源所需要的最小内存空间大小
- if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[1]), Pointer(Value), Len) then ProductName.Caption := Value;
- if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[2]), Pointer(Value), Len) then ProductVersion.Caption := '产品版本: ' + Value;
- if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[3]), Pointer(Value), Len) then FileDescription.Caption := '文件说明: ' + Value;
- if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[4]), Pointer(Value), Len) then LegalCopyright.Caption := '合法版权: ' + Value;
- if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[5]), Pointer(Value), Len) then FileVersion.Caption := '文件版本: ' + Value;
- if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[6]), Pointer(Value), Len) then CompanyName.Caption := '公司名称: ' + Value;
- if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[7]), Pointer(Value), Len) then LegalTrademarks.Caption := '合法商标: ' + Value;
- if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[8]), Pointer(Value), Len) then InternalName.Caption := '内部名称: ' + Value;
- if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[9]), Pointer(Value), Len) then OriginalFilename.Caption := '原文件名: ' + Value;
- FreeMem(Buf, BufSize); //释放内存
- end else begin
- Application.MessageBox('获取产品信息时遇到错误,请尝试重新启动'','错误',MB_OK + MB_ICONSTOP);
- Application.Terminate;
- end;
修改于:2019.12.06
Delphi 版本信息获取函数 GetFileVersionInfo、GetFileVersionInfoSize、VerFindFile、VerInstallFile和VerQueryValue的更多相关文章
- 获取Exe文件版本信息的函数(使用GetFileVersionInfo得到TFileVersionInfo结构体,包含12项内容)
Type TFileVersionInfo = Record FixedInfo:TVSFixedFileInfo; {版本信息} Comp ...
- PHP文件信息获取函数
知识点: basename():获取文件名,传入第二个参数则只显示文件名,不显示后缀 dirname():获取文件路径 pathinfo():将文件信息存入一个数组,通过索引basename,dirn ...
- ida信息获取函数
idc. http://www.cnblogs.com/fply/p/8503929.html 获取ida可执行文件路径 GetIdaDirectory() print GetIdaDirect ...
- GetFileVersionInfoSize函数确定操作系统是否可以检索指定文件的版本信息
GetFileVersionInfoSize函数 -------------------------------------------------- ------------------------ ...
- delphi 文件操作(信息获取)
delphi获取Exe文件版本信息的函数 Type TFileVersionInfo = Record FixedInfo:TVSFixedFileInfo; {版本信息} CompanyName:S ...
- E1.获取Elixir/Erlang版本信息
E1.获取Elixir/Erlang版本信息 获取Elixir版本 直接在shel中打开iex (interactive shell),就可以查到具体的版本信息: iex Erlang/OTP 22 ...
- 获取windows版本信息的做法
作者:朱金灿 来源:http://blog.csdn.net/clever101 个人不建议用 GetVersion 或GetVersionEx 之类的 API 来获取系统版本号.注意微软也说过,这个 ...
- js获取浏览器版本信息整理
一.Navigator 对象 JavaScript Navigator 对象包含了有关访问者浏览器的所有信息.接下来我们学习 Navigator 对象的两个属性. appName 保存浏览器类型 ap ...
- VC++ 获取exe或者dll版本信息
#include <iostream> #include <atlstr.h> #pragma comment(lib,"version.lib") CSt ...
随机推荐
- spring-boot整合Mybatis多数据源案例
1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/springBo ...
- JS在页面加载之后运行
通用的页面加载后再运行JS有两种方式:1.在DOM加载完毕后,页面全部内容(如图片等)完全加载完毕前运行JS. 2.在页面全部内容加载完成(包括引用文件,图片等)之后再加载JS 1.在DOM加载后 ...
- SEERC 2018 I - Inversion (Gym - 101964I) DP
Gym - 101964I 题意 有一个数组\(p\),如果满足\(i<j,p_i>p_j\),则\(i,j\)之间就有一条边相连,问存在多少个集合满足集合内的元素互不相连,且集合外的元素 ...
- k-近邻算法(kNN)笔记
#mat()函数可以将数组(array)转化为矩阵(matrix)# randMat = mat(random.rand(4,4))# 求逆矩阵:randMat.I# 存储逆矩阵:invRandMat ...
- nIce 不看会后悔的o!
今天小编来跟大家探讨关于“控件”.控件非常好玩,可以构建出不同的场景和不同风格的Windows画面.相信大家绝对狠感兴趣是吧~~~ 好了,下面小编就为大家来展示风采喽 下面先为大家展示一些比较基础 ...
- vector代替数组
vector代替数组 1.声明一个int向量以替代一维的数组:vector <int> a;(等于声明了一个int数组a[],大小没有指定,可以动态的向里面添加删除). 2.用vector ...
- Python进阶:多线程、多进程和线程池编程/协程和异步io/asyncio并发编程
gil: gil使得同一个时刻只有一个线程在一个CPU上执行字节码,无法将多个线程映射到多个CPU上执行 gil会根据执行的字节码行数以及时间片释放gil,gil在遇到io的操作时候主动释放 thre ...
- iview+vue 表格任一项实现鼠标划上显示内容
在新版本的iview中,表格新增了tooltip功能: 但做项目时并不是新的iview版本,又不想升级,如何才能实现当内容过多鼠标划上显示内容?下边是我做项目时的改动: { // fixed: 'le ...
- b/s 起点
1.Web前端: JavaScript (1)脚本语言.JavaScript是一种解释型的脚本语言,C.C++等语言先编译后执行,而JavaScript是在程序的运行过程中逐行进行解释. (2)基于对 ...
- Android深度探索-卷1第三章心得体会
第三章整章介绍了git,git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.通过配置git后可以很方便的找到需要的资源,更多的是代码和包,可以在本地建立版本库,为了 ...