科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件用Delphi实现动态获取版本信息

用Delphi实现动态获取版本信息

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文介绍了在Delphi开发中如何使用Windows API实现运行时动态获取程序文件版本信息

作者:佚名 来源:论坛 2007年10月31日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
二、一个关于版本信息函数使用的实例

  下面开始,我们给出一个实例。通过这个实例,大家可以学习到在我们自己编写的应用程序中怎么使用这些函数来达到获取文件版本信息的目的。

  2.1. 建立实例窗体样板

  首先,我们需要建立两个Delphi窗体,它们分别是程序主窗体和关于对话框窗体。用于这个程序只作演示用途,所以没有必要在主窗体中实现过多的功能。事实上,在我们这个实例中,主窗体上只有“关于”和“退出”两个菜单项。

  稍微复杂一点的要算是关于对话框窗体了。在这个窗体中,将包含“产品名称”、“产品版本号”、“文件说明”、“产品合法商标”、“运行文件版本号”、“公司名称”、“合法商标”、“产品内部名称”、“原文件名”等几个重要且基本的版本信息。当然,正如你所看到的,在这个窗体中还包含了操作系统信息版本和系统内存信息。但由于篇幅的关系,两条信息的获取方法在本文中不会加以说明。我们会在下一次的学习中讨论这两个话题。关于对话框的布局如下图,大家可以对比这个图片自己用Delphi制作一个对话框处出来。


[插入图片1]

  2.2. 填写应用程序的运行文件版本信息

  在Delphi的集成编辑器中按下Shift+Ctrl+F11键,在弹出的对话框中按照下表的内容,在相应键值的未知输入内容:


[插入表格2]

  2.3. 实现获取版本信息功能的代码

  下面的代码是这个关于对话框创建时的事件响应代码片断。大家把它们拷贝+粘贴到窗体的OnCreate事件中就可以了。

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);

// OperatingSystem.Caption := GetOSVerInfo;

// SystemMemory.Caption := GetMemStat;
end
else begin
Application.MessageBox('获取产品信息时遇到致命错误,请尝试重新启动软件。'+ #13 + '若仍未能解决问题,请联系产品服务人员。','错误',MB_OK + MB_ICONSTOP);
Application.Terminate;
end;

  在这段代码中,首先通过调用GetFileVersionInfoSize()函数获得在内存中存储版本信息资源所需要的最小内存空间大小。如果函数的返回值小于等于0,则函数调用失败,继而程序转入错误处理部分。在这部分的错误处理代码中,程序会提示用户程序运行实现错误,并要求用户重新启动软件。

  如果函数调用成功,程序将通过AllocMem()函数向操作系统申请一块内容空间,用于保存从文件中获得的版本信息资源。

  此后,利用GetFileVersionInfo()函数从文件中得到版本信息。但这些信息对我们来说是不可读的,因为它们都是一些二进制的编码。在随后的程序中,通过一连串对VerQueryValue()函数的调用,我们得到了文件的版本信息,并把它们显示在这个关于对话框窗体中正确的位置上。

  在使用完这些信息后,我们一定要记住用FreeMem()函数释放前面用AllocMem()函数分配的内存,否则就会出现内存泄漏。

// OperatingSystem.Caption := GetOSVerInfo;

  和

// SystemMemory.Caption := GetMemStat;

  这两行代码调用的两个函数是我自己编制的,分别用于获取操作系统版本信息和内存信息。前面已经说过,由于篇幅的关系,我们在这里暂时跳过这两行代码,不去管它。反正程序已经可以正常的运行了。

  三、总结

  通过本文中对文件版本信息处理方法的简单介绍,相信读者已经对这种技术有了一个初步的认识。这种实用且非常重要的技术是不是很简单呢?答案当然是肯定的!正如上面所讲述的内容,其实就是对那六个函数的交替调用。在这里唯一要提醒读者的是,在使用这些函数的时候,一定要注意调用次序,不能搞错,否则很有可能怎么也不能正常访问这些函数(函数返回值始终是调用失败)。

  在第二节中的哪个实例的源代码,我们在Windows 2000简体中文专业版和Delphi 6.0企业版的编程环境下调试通过,所有代码均能正常运行。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章