分享

Delphi7取项目工程的版本号

 独孤求财 2012-11-09

Delphi7取项目工程的版本号

(2011-01-23 21:44:44)
标签:

杂谈

分类: delphi

用delphi开发客户端时,首先需解决的是程序的升级问题,因为一旦程序有所改变,程序同有可能每个客户端去升级,在这里我推荐一种升级控件:AutoUpgrader,虽然是老外开发的,但也有支持中文,如果想做得正规一点,可以用VS修改一下auAutoUpgraderLang.res中的字符串资源,将其中的名称,标志改为自已项目的名称,标志即可.

言规正传,要想程序升级,需要先判断程序的版本号,呵呵,想了很多方法,发现下面这种方法较好,共享一下,呵呵.

再多说一句,在程序中包含版本号时,最好能将auto-increment build number选中,这样版本较为好控制.

unit UVersionInfo;
{* 获取应用程序版本类单元 }

interface

uses Windows,Types,SysUtils,Dialogs;

type
  TExeVersionInfo = class(TObject)
  private
    FProductName: string;
    FProductVersion: string;
    FFileDescription: string;
    FLegalCopyright: string;
    FFileVersion: string;
    FCompanyName: string;
    FLegalTradeMarks: string;
    FInternalName: string;
    FOriginalFileName: string;
    FExeFullName: string;
  protected
    procedure GetVersionInfo;
  public
    Constructor Create(AExeFullName:string);

    property ProductName: string read FProductName;
    property ProductVersion: string read FProductVersion;
    property FileDescription: string read FFileDescription;
    property LegalCopyright: string read FLegalCopyright;
    property FileVersion: string read FFileVersion;
    property CompanyName: string read FCompanyName;
    property LegalTradeMarks: string read FLegalTradeMarks;
    property InternalName: string read FInternalName;
    property OriginalFileName: string read FOriginalFileName;
  end;

implementation

constructor TExeVersionInfo.Create(AExeFullName:string);
begin
  FExeFullName:=AExeFullName;
  GetVersionInfo;
end;

procedure TExeVersionInfo.GetVersionInfo;
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 := FExeFullName;
  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
       FProductName := Value;
    if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[2]), Pointer(Value), Len) then
       FProductVersion := Value;
    if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[3]), Pointer(Value), Len) then
       FFileDescription := Value;
    if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[4]), Pointer(Value), Len) then
       FLegalCopyright := Value;
    if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[5]), Pointer(Value), Len) then
       FFileVersion := Value;
    if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[6]), Pointer(Value), Len) then
       FCompanyName := Value;
    if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[7]), Pointer(Value), Len) then
       FLegalTrademarks := Value;
    if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[8]), Pointer(Value), Len) then
       FInternalName := Value;
    if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[9]), Pointer(Value), Len) then
       FOriginalFilename := Value;
    FreeMem(Buf, BufSize);
  end
  else
  begin
    Showmessage('获取产品信息时遇到错误,请检查工程文件的选项设置是否包含了版本信息!。');
  end;
end;

end.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多