Delphi通过GetFileVersionInfo和VerQueryValue等API函数取得详细EXE信息

This has been described at About:

http://delphi.about.com/cs/adptips2001/a/bltip0701_4.htm
Basically, you just use the GetFileVersionInfo function to obtain the data and then VerQueryValue function to read it.

Because these API functions are a bit ‘hard‘ to use, I have written a simple example:

type
TEXEVersionData = record
CompanyName,
FileDescription,
FileVersion,
InternalName,
LegalCopyright,
LegalTrademarks,
OriginalFileName,
ProductName,
ProductVersion,
Comments,
PrivateBuild,
SpecialBuild: string;
end;

function GetEXEVersionData(const FileName: string): TEXEVersionData;
type
PLandCodepage = ^TLandCodepage;
TLandCodepage = record
wLanguage,
wCodePage: word;
end;
var
dummy,
len: cardinal;
buf, pntr: pointer;
lang: string;
begin
len := GetFileVersionInfoSize(PChar(FileName), dummy);
if len = 0 then
RaiseLastOSError;
GetMem(buf, len);
try
if not GetFileVersionInfo(PChar(FileName), 0, len, buf) then
RaiseLastOSError;

if not VerQueryValue(buf, ‘\VarFileInfo\Translation\‘, pntr, len) then
RaiseLastOSError;

lang := Format(‘%.4x%.4x‘, [PLandCodepage(pntr)^.wLanguage, PLandCodepage(pntr)^.wCodePage]);

if VerQueryValue(buf, PChar(‘\StringFileInfo\‘ + lang + ‘\CompanyName‘), pntr, len){ and (@len <> nil)} then
result.CompanyName := PChar(pntr);
if VerQueryValue(buf, PChar(‘\StringFileInfo\‘ + lang + ‘\FileDescription‘), pntr, len){ and (@len <> nil)} then
result.FileDescription := PChar(pntr);
if VerQueryValue(buf, PChar(‘\StringFileInfo\‘ + lang + ‘\FileVersion‘), pntr, len){ and (@len <> nil)} then
result.FileVersion := PChar(pntr);
if VerQueryValue(buf, PChar(‘\StringFileInfo\‘ + lang + ‘\InternalName‘), pntr, len){ and (@len <> nil)} then
result.InternalName := PChar(pntr);
if VerQueryValue(buf, PChar(‘\StringFileInfo\‘ + lang + ‘\LegalCopyright‘), pntr, len){ and (@len <> nil)} then
result.LegalCopyright := PChar(pntr);
if VerQueryValue(buf, PChar(‘\StringFileInfo\‘ + lang + ‘\LegalTrademarks‘), pntr, len){ and (@len <> nil)} then
result.LegalTrademarks := PChar(pntr);
if VerQueryValue(buf, PChar(‘\StringFileInfo\‘ + lang + ‘\OriginalFileName‘), pntr, len){ and (@len <> nil)} then
result.OriginalFileName := PChar(pntr);
if VerQueryValue(buf, PChar(‘\StringFileInfo\‘ + lang + ‘\ProductName‘), pntr, len){ and (@len <> nil)} then
result.ProductName := PChar(pntr);
if VerQueryValue(buf, PChar(‘\StringFileInfo\‘ + lang + ‘\ProductVersion‘), pntr, len){ and (@len <> nil)} then
result.ProductVersion := PChar(pntr);
if VerQueryValue(buf, PChar(‘\StringFileInfo\‘ + lang + ‘\Comments‘), pntr, len){ and (@len <> nil)} then
result.Comments := PChar(pntr);
if VerQueryValue(buf, PChar(‘\StringFileInfo\‘ + lang + ‘\PrivateBuild‘), pntr, len){ and (@len <> nil)} then
result.PrivateBuild := PChar(pntr);
if VerQueryValue(buf, PChar(‘\StringFileInfo\‘ + lang + ‘\SpecialBuild‘), pntr, len){ and (@len <> nil)} then
result.SpecialBuild := PChar(pntr);
finally
FreeMem(buf);
end;
end;
Try it. But beware -- currently, this only works for en-us EXEs! It doesn‘t work for most of the EXEs on my Swedish machine, for instance. It is late now; tomorrow I will extend this to work with any EXE language, if only I get some time left. [The About.com code has the same problem, but they don‘t even pretend it is a problem!]

Update: The code now works with any EXE language.

http://stackoverflow.com/questions/5539316/how-can-i-read-details-of-file

http://stackoverflow.com/questions/17340794/verqueryvalue-does-not-work-with-single-character-values

http://stackoverflow.com/questions/6557778/get-fileversion-with-build

时间: 2024-11-08 22:39:57

Delphi通过GetFileVersionInfo和VerQueryValue等API函数取得详细EXE信息的相关文章

Delphi获取当前系统时间(使用API函数GetSystemTime)

在开发应用程序时往往需要获取当前系统时间.尽管Y2K似乎已经平安过去,但在我们新开发的应用程序中还是要谨慎处理“时间”问题. 在<融会贯通--Delphi4.0实战技巧>(以下简称“该书”)第89页专门介绍了两种获取当前系统时间的方法,但这两种方法都存在不足或错误,以下就此进行讨论. 该书第一种方法是利用Time()函数获得当前系统时间,返回结果是TDateTime结构类型的变量.例如: procedure TForm1.Button2Click(Sender: TObject); var D

Delphi内存操作API函数(备查,并一一学习)

Delphi内存操作API函数System.IsMemoryManagerSet;System.Move;System.New;System.ReallocMem;System.ReallocMemory;System.SetMemoryManager;System.SysAllocMem;System.SysFreeMem;System.SysGetMem;System.SysReallocMem; SysUtils.DisposeStr;SysUtils.NewStr; TlHelp32.H

Delphi 常用API 函数

Delphi 常用API 函数 AdjustWindowRect 给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小 AnyPopup 判断屏幕上是否存在任何弹出式窗口 ArrangeIconicWindows 排列一个父窗口的最小化子窗口 AttachThreadInput 连接线程输入函数 BeginDeferWindowPos 启动构建一系列新窗口位置的过程 BringWindowToTop 将指定的窗口带至窗口列表顶部 CascadeWindows 以层叠方式排列窗口 ChildWi

Delphi - Windows系统下,Delphi调用API函数和7z.dll动态库,自动把文件压缩成.tar.gz格式的文件

项目背景 应欧美客户需求,需要将文件压缩成.tar.gz格式的文件,并上传给客户端SFTP服务器. 你懂的,7-Zip软件的显著特点是文件越大压缩比越高,在Linux系统上相当于我们Windows系统上WinRAR或者好压软件一样的存在. 7-Zip软件下载与安装 网上下载相关安装包并完成安装,找到安装目录,复制7z.dll文件到D盘. .bat文件的制作 通过7-Zip软件使用手册了解到,通过动态命令行调用7z.dll可以把文件压缩成.tar.gz格式的,实际上是先将文件压缩成.tar格式的文

Delphi使用Windows API函数AnimateWindow实现窗体特效

{**********************************************************************API函数 AnimateWindow 使用:函数功能:窗体显示和隐藏时产生特殊的动画效果:可以产生两种类型的动画效果:          滚动动画 和 滑动动画函数原型:BOOL AnimateWindow(HWND hWnd, DWORD dwTime, DWORD dwFlags)参数说明:hWnd 指定产生动画效果的窗体的句柄:          

Delphi 常用API 函数(好多都没见过)

AdjustWindowRect 给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小AnyPopup 判断屏幕上是否存在任何弹出式窗口ArrangeIconicWindows 排列一个父窗口的最小化子窗口AttachThreadInput 连接线程输入函数BeginDeferWindowPos 启动构建一系列新窗口位置的过程BringWindowToTop 将指定的窗口带至窗口列表顶部CascadeWindows 以层叠方式排列窗口ChildWindowFromPoint 返回父窗口中包含了

linux API函数大全

还没有认真研读过,今晚在其他博客上找了比较久,今晚时间也不多了,等有空再细看 先复制先 获取当前执行路径:getcwd 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接  WNetAddConnection2 创建同一个网络资源的连接  WNetAddConnection3 创建同一个网络资源的连接  WNetCancelConnection 结束一个网络连接  WNetCancelConnection2 结束一个网络连接  WNetCloseEnum

C++ Builder 全部API函数列表

1 其他类似API网站: 新版WIN32API大全:http://www.3http.com/book/win32api/000.htm 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一个网络连接 WNetCancelConnection2 结束一个网络连接 WNetCloseE

C#常用 API函数大全

常用Windows API1. API之网络函数WNetAddConnection 创建同一个网络资源的永久性连接WNetAddConnection2 创建同一个网络资源的连接WNetAddConnection3 创建同一个网络资源的连接WNetCancelConnection 结束一个网络连接WNetCancelConnection2 结束一个网络连接WNetCloseEnum 结束一次枚举操作WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接WNetDis