Rxverinf.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:12k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {         Delphi VCL Extensions (RX)                    }
  4. {                                                       }
  5. {         Copyright (c) 1995, 1996 AO ROSNO             }
  6. {                                                       }
  7. {*******************************************************}
  8. unit RxVerInf;
  9. { Working with VERSIONINFO resourse type }
  10. {$I RX.INC}
  11. {$IFDEF RX_D3}
  12.   {$WEAKPACKAGEUNIT}
  13. {$ENDIF}
  14. interface
  15. uses {$IFDEF WIN32} Windows {$ELSE} Ver {$ENDIF};
  16. type
  17.   TVersionLanguage = (vlArabic, vlBulgarian, vlCatalan, vlTraditionalChinese,
  18.     vlCzech, vlDanish, vlGerman, vlGreek, vlUSEnglish, vlCastilianSpanish,
  19.     vlFinnish, vlFrench, vlHebrew, vlHungarian, vlIcelandic, vlItalian,
  20.     vlJapanese, vlKorean, vlDutch, vlNorwegianBokmel, vlPolish,
  21.     vlBrazilianPortuguese, vlRhaetoRomanic, vlRomanian, vlRussian,
  22.     vlCroatoSerbian, vlSlovak, vlAlbanian, vlSwedish, vlThai, vlTurkish,
  23.     vlUrdu, vlBahasa, vlSimplifiedChinese, vlSwissGerman, vlUKEnglish,
  24.     vlMexicanSpanish, vlBelgianFrench, vlSwissItalian, vlBelgianDutch,
  25.     vlNorwegianNynorsk, vlPortuguese, vlSerboCroatian, vlCanadianFrench,
  26.     vlSwissFrench, vlUnknown);
  27.   TVersionCharSet = (vcsASCII, vcsJapan, vcsKorea, vcsTaiwan, vcsUnicode,
  28.     vcsEasternEuropean, vcsCyrillic, vcsMultilingual, vcsGreek, vcsTurkish,
  29.     vcsHebrew, vcsArabic, vcsUnknown);
  30. {$IFNDEF WIN32}
  31.   PVSFixedFileInfo = Pvs_FixedFileInfo;
  32.   DWORD = Longint;
  33. {$ENDIF}
  34.   TLongVersion = record
  35.     case Integer of
  36.     0: (All: array[1..4] of Word);
  37.     1: (MS, LS: LongInt);
  38.   end;
  39. { TVersionInfo }
  40.   TVersionInfo = class(TObject)
  41.   private
  42.     FFileName: PChar;
  43.     FValid: Boolean;
  44.     FSize: DWORD;
  45.     FBuffer: PChar;
  46.     FHandle: DWORD;
  47.     procedure ReadVersionInfo;
  48.     function GetFileName: string;
  49.     procedure SetFileName(const Value: string);
  50.     function GetTranslation: Pointer;
  51.     function GetFixedFileInfo: PVSFixedFileInfo;
  52.     function GetFileLongVersion: TLongVersion;
  53.     function GetProductLongVersion: TLongVersion;
  54.     function GetTranslationString: string;
  55.     function GetComments: string;
  56.     function GetCompanyName: string;
  57.     function GetFileDescription: string;
  58.     function GetFileVersion: string;
  59.     function GetVersionNum: Longint;
  60.     function GetInternalName: string;
  61.     function GetLegalCopyright: string;
  62.     function GetLegalTrademarks: string;
  63.     function GetOriginalFilename: string;
  64.     function GetProductVersion: string;
  65.     function GetProductName: string;
  66.     function GetSpecialBuild: string;
  67.     function GetPrivateBuild: string;
  68.     function GetVersionLanguage: TVersionLanguage;
  69.     function GetVersionCharSet: TVersionCharSet;
  70.     function GetVerFileDate: TDateTime;
  71.   public
  72.     constructor Create(const AFileName: string);
  73.     destructor Destroy; override;
  74.     function GetVerValue(const VerName: string): string;
  75.     property FileName: string read GetFileName write SetFileName;
  76.     property Valid: Boolean read FValid;
  77.     property FixedFileInfo: PVSFixedFileInfo read GetFixedFileInfo;
  78.     property FileLongVersion: TLongVersion read GetFileLongVersion;
  79.     property ProductLongVersion: TLongVersion read GetProductLongVersion;
  80.     property Translation: Pointer read GetTranslation;
  81.     property VersionLanguage: TVersionLanguage read GetVersionLanguage;
  82.     property VersionCharSet: TVersionCharSet read GetVersionCharSet;
  83.     property VersionNum: Longint read GetVersionNum;
  84.     property Comments: string read GetComments;
  85.     property CompanyName: string read GetCompanyName;
  86.     property FileDescription: string read GetFileDescription;
  87.     property FileVersion: string read GetFileVersion;
  88.     property InternalName: string read GetInternalName;
  89.     property LegalCopyright: string read GetLegalCopyright;
  90.     property LegalTrademarks: string read GetLegalTrademarks;
  91.     property OriginalFilename: string read GetOriginalFilename;
  92.     property ProductVersion: string read GetProductVersion;
  93.     property ProductName: string read GetProductName;
  94.     property SpecialBuild: string read GetSpecialBuild;
  95.     property PrivateBuild: string read GetPrivateBuild;
  96.     property Values[const Name: string]: string read GetVerValue;
  97.     property VerFileDate: TDateTime read GetVerFileDate;
  98.   end;
  99. function LongVersionToString(const Version: TLongVersion): string;
  100. function StringToLongVersion(const Str: string): TLongVersion;
  101. function AppFileName: string;
  102. function AppVerInfo: TVersionInfo;
  103. { Installation utility routine }
  104. function OkToWriteModule(ModuleName: string; NewVer: Longint): Boolean;
  105. implementation
  106. {$IFDEF WIN32}
  107. uses SysUtils, FileUtil, DateUtil;
  108. {$ELSE}
  109. uses WinTypes, WinProcs, SysUtils, FileUtil, DateUtil, VclUtils;
  110. {$ENDIF}
  111. function MemAlloc(Size: Longint): Pointer;
  112. {$IFDEF WIN32}
  113. begin
  114.   GetMem(Result, Size);
  115. end;
  116. {$ELSE}
  117. var
  118.   Handle: THandle;
  119. begin
  120.   if Size < 65535 then GetMem(Result, Size)
  121.   else begin
  122.     Handle := GlobalAlloc(HeapAllocFlags, Size);
  123.     Result := GlobalLock(Handle);
  124.   end;
  125. end;
  126. {$ENDIF WIN32}
  127. const
  128.   LanguageValues: array[TVersionLanguage] of Word = ($0401, $0402, $0403,
  129.     $0404, $0405, $0406, $0407, $0408, $0409, $040A, $040B, $040C, $040D,
  130.     $040E, $040F, $0410, $0411, $0412, $0413, $0414, $0415, $0416, $0417,
  131.     $0418, $0419, $041A, $041B, $041C, $041D, $041E, $041F, $0420, $0421,
  132.     $0804, $0807, $0809, $080A, $080C, $0810, $0813, $0814, $0816, $081A,
  133.     $0C0C, $100C, $0000);
  134. const
  135.   CharacterSetValues: array[TVersionCharSet] of Integer = (0, 932, 949, 950,
  136.     1200, 1250, 1251, 1252, 1253, 1254, 1255, 1256, -1);
  137. { TVersionInfo }
  138. constructor TVersionInfo.Create(const AFileName: string);
  139. begin
  140.   inherited Create;
  141.   FFileName := StrPCopy(StrAlloc(Length(AFileName) + 1), AFileName);
  142.   ReadVersionInfo;
  143. end;
  144. destructor TVersionInfo.Destroy;
  145. begin
  146.   if FBuffer <> nil then FreeMem(FBuffer, FSize);
  147.   StrDispose(FFileName);
  148.   inherited Destroy;
  149. end;
  150. procedure TVersionInfo.ReadVersionInfo;
  151. begin
  152.   FValid := False;
  153.   FSize := GetFileVersionInfoSize(FFileName, FHandle);
  154.   if FSize > 0 then
  155.     try
  156.       FBuffer := MemAlloc(FSize);
  157.       FValid := GetFileVersionInfo(FFileName, FHandle, FSize, FBuffer);
  158.     except
  159.       FValid := False;
  160.       raise;
  161.     end;
  162. end;
  163. function TVersionInfo.GetFileName: string;
  164. begin
  165.   Result := StrPas(FFileName);
  166. end;
  167. procedure TVersionInfo.SetFileName(const Value: string);
  168. begin
  169.   if FBuffer <> nil then FreeMem(FBuffer, FSize);
  170.   FBuffer := nil;
  171.   StrDispose(FFileName);
  172.   FFileName := StrPCopy(StrAlloc(Length(Value) + 1), Value);
  173.   ReadVersionInfo;
  174. end;
  175. function TVersionInfo.GetTranslation: Pointer;
  176. var
  177. {$IFDEF WIN32}
  178.   Len: UINT;
  179. {$ELSE}
  180.   Len: Cardinal;
  181. {$ENDIF}
  182. begin
  183.   Result := nil;
  184.   if Valid then VerQueryValue(FBuffer, 'VarFileInfoTranslation', Result, Len)
  185.   else Result := nil;
  186. end;
  187. function TVersionInfo.GetTranslationString: string;
  188. var
  189.   P: Pointer;
  190. begin
  191.   Result := '';
  192.   P := GetTranslation;
  193.   if P <> nil then
  194.     Result := IntToHex(MakeLong(HiWord(Longint(P^)), LoWord(Longint(P^))), 8);
  195. end;
  196. function TVersionInfo.GetVersionLanguage: TVersionLanguage;
  197. var
  198.   P: Pointer;
  199. begin
  200.   P := GetTranslation;
  201.   for Result := vlArabic to vlUnknown do
  202.     if LoWord(Longint(P^)) = LanguageValues[Result] then Break;
  203. end;
  204. function TVersionInfo.GetVersionCharSet: TVersionCharSet;
  205. var
  206.   P: Pointer;
  207. begin
  208.   P := GetTranslation;
  209.   for Result := vcsASCII to vcsUnknown do
  210.     if HiWord(Longint(P^)) = CharacterSetValues[Result] then Break;
  211. end;
  212. function TVersionInfo.GetFixedFileInfo: PVSFixedFileInfo;
  213. var
  214. {$IFDEF WIN32}
  215.   Len: UINT;
  216. {$ELSE}
  217.   Len: Cardinal;
  218. {$ENDIF}
  219. begin
  220.   Result := nil;
  221.   if Valid then VerQueryValue(FBuffer, '', Pointer(Result), Len)
  222.   else Result := nil;
  223. end;
  224. function TVersionInfo.GetProductLongVersion: TLongVersion;
  225. begin
  226.   Result.MS := FixedFileInfo^.dwProductVersionMS;
  227.   Result.LS := FixedFileInfo^.dwProductVersionLS;
  228. end;
  229. function TVersionInfo.GetFileLongVersion: TLongVersion;
  230. begin
  231.   Result.MS := FixedFileInfo^.dwFileVersionMS;
  232.   Result.LS := FixedFileInfo^.dwFileVersionLS;
  233. end;
  234. function TVersionInfo.GetVersionNum: Longint;
  235. begin
  236.   if Valid then Result := FixedFileInfo^.dwFileVersionMS
  237.   else Result := 0;
  238. end;
  239. function TVersionInfo.GetVerValue(const VerName: string): string;
  240. var
  241.   szName: array[0..255] of Char;
  242.   Value: Pointer;
  243. {$IFDEF WIN32}
  244.   Len: UINT;
  245. {$ELSE}
  246.   Len: Cardinal;
  247. {$ENDIF}
  248. begin
  249.   Result := '';
  250.   if Valid then begin
  251.     StrPCopy(szName, 'StringFileInfo' + GetTranslationString + '' + VerName);
  252.     if VerQueryValue(FBuffer, szName, Value, Len) then
  253.       Result := StrPas(PChar(Value));
  254.   end;
  255. end;
  256. function TVersionInfo.GetComments: string;
  257. begin
  258.   Result := GetVerValue('Comments');
  259. end;
  260. function TVersionInfo.GetCompanyName: string;
  261. begin
  262.   Result := GetVerValue('CompanyName');
  263. end;
  264. function TVersionInfo.GetFileDescription: string;
  265. begin
  266.   Result := GetVerValue('FileDescription');
  267. end;
  268. function TVersionInfo.GetFileVersion: string;
  269. begin
  270.   Result := GetVerValue('FileVersion');
  271.   if (Result = '') and Valid then
  272.     Result := LongVersionToString(FileLongVersion);
  273. end;
  274. function TVersionInfo.GetInternalName: string;
  275. begin
  276.   Result := GetVerValue('InternalName');
  277. end;
  278. function TVersionInfo.GetLegalCopyright: string;
  279. begin
  280.   Result := GetVerValue('LegalCopyright');
  281. end;
  282. function TVersionInfo.GetLegalTrademarks: string;
  283. begin
  284.   Result := GetVerValue('LegalTrademarks');
  285. end;
  286. function TVersionInfo.GetOriginalFilename: string;
  287. begin
  288.   Result := GetVerValue('OriginalFilename');
  289. end;
  290. function TVersionInfo.GetProductVersion: string;
  291. begin
  292.   Result := GetVerValue('ProductVersion');
  293.   if (Result = '') and Valid then
  294.     Result := LongVersionToString(ProductLongVersion);
  295. end;
  296. function TVersionInfo.GetProductName: string;
  297. begin
  298.   Result := GetVerValue('ProductName');
  299. end;
  300. function TVersionInfo.GetSpecialBuild: string;
  301. begin
  302.   Result := GetVerValue('SpecialBuild');
  303. end;
  304. function TVersionInfo.GetPrivateBuild: string;
  305. begin
  306.   Result := GetVerValue('PrivateBuild');
  307. end;
  308. function TVersionInfo.GetVerFileDate: TDateTime;
  309. begin
  310.   if FileExists(FileName) then
  311.     Result := FileDateTime(FileName)
  312.   else Result := NullDate;
  313. end;
  314. { Long version string routines }
  315. function LongVersionToString(const Version: TLongVersion): string;
  316. begin
  317.   with Version do
  318.     Result := Format('%d.%d.%d.%d', [All[2], All[1], All[4], All[3]]);
  319. end;
  320. function StringToLongVersion(const Str: string): TLongVersion;
  321. var
  322.   Sep: Integer;
  323.   Tmp, Fragment: string;
  324.   I: Byte;
  325. begin
  326.   Tmp := Str;
  327.   for I := 1 to 4 do begin
  328.     Sep := Pos('.', Tmp);
  329.     if Sep = 0 then Sep := Pos(',', Tmp);
  330.     if Sep = 0 then Fragment := Tmp
  331.     else begin
  332.       Fragment := Copy(Tmp, 1, Sep - 1);
  333.       Tmp := Copy(Tmp, Sep + 1, MaxInt);
  334.     end;
  335.     if Fragment = '' then Result.All[I] := 0
  336.     else Result.All[I] := StrToInt(Fragment);
  337.   end;
  338.   I := Result.All[1];
  339.   Result.All[1] := Result.All[2];
  340.   Result.All[2] := I;
  341.   I := Result.All[3];
  342.   Result.All[3] := Result.All[4];
  343.   Result.All[4] := I;
  344. end;
  345. function AppFileName: string;
  346. var
  347.   FileName: array[0..255] of Char;
  348. begin
  349.   if IsLibrary then begin
  350.     GetModuleFileName(HInstance, FileName, SizeOf(FileName) - 1);
  351.     Result := StrPas(FileName);
  352.   end
  353.   else Result := ParamStr(0);
  354. end;
  355. function AppVerInfo: TVersionInfo;
  356. begin
  357.   Result := TVersionInfo.Create(AppFileName);
  358. end;
  359. { Installation utility routines }
  360. function OkToWriteModule(ModuleName: string; NewVer: Longint): Boolean;
  361. { Return True if it's ok to overwrite ModuleName with NewVer }
  362. begin
  363.   {Assume we should overwrite}
  364.   OkToWriteModule := True;
  365.   with TVersionInfo.Create(ModuleName) do begin
  366.     try
  367.       if Valid then {Should we overwrite?}
  368.         OkToWriteModule := NewVer > VersionNum;
  369.     finally
  370.       Free;
  371.     end;
  372.   end;
  373. end;
  374. end.