用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