VerInfo.pas 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. unit VerInfo;
  2. {
  3. Inno Setup
  4. Copyright (C) 1997-2024 Jordan Russell
  5. Portions by Martijn Laan
  6. For conditions of distribution and use, see LICENSE.TXT.
  7. Version info functions
  8. }
  9. interface
  10. uses
  11. Windows, SysUtils, Int64Em;
  12. {$I VERSION.INC}
  13. type
  14. TFileVersionNumbers = record
  15. MS, LS: LongWord;
  16. end;
  17. function GetVersionInfo(const Filename: String;
  18. var VersionInfo: TVSFixedFileInfo): Boolean;
  19. function GetVersionNumbers(const Filename: String;
  20. var VersionNumbers: TFileVersionNumbers): Boolean;
  21. function StrToVersionNumbers(const S: String;
  22. var Version: TFileVersionNumbers): Boolean;
  23. implementation
  24. uses
  25. CmnFunc2, FileClass;
  26. function GetVersionInfo(const Filename: String;
  27. var VersionInfo: TVSFixedFileInfo): Boolean;
  28. var
  29. VersionSize: Integer;
  30. VersionHandle: DWORD;
  31. VersionBuf: PChar;
  32. VerInfo: PVSFixedFileInfo;
  33. VerInfoSize: UINT;
  34. begin
  35. Result := False;
  36. VersionSize := GetFileVersionInfoSize(PChar(Filename), VersionHandle);
  37. if VersionSize > 0 then begin
  38. GetMem(VersionBuf, VersionSize);
  39. try
  40. if GetFileVersionInfo(PChar(Filename), VersionHandle, VersionSize, VersionBuf) then begin
  41. if VerQueryValue(VersionBuf, '\', Pointer(VerInfo), VerInfoSize) then begin
  42. VersionInfo := VerInfo^;
  43. Result := True;
  44. end;
  45. end;
  46. finally
  47. FreeMem(VersionBuf);
  48. end;
  49. end;
  50. end;
  51. function GetVersionNumbers(const Filename: String;
  52. var VersionNumbers: TFileVersionNumbers): Boolean;
  53. var
  54. VerInfo: TVSFixedFileInfo;
  55. begin
  56. Result := GetVersionInfo(Filename, VerInfo);
  57. if Result then begin
  58. VersionNumbers.MS := VerInfo.dwFileVersionMS;
  59. VersionNumbers.LS := VerInfo.dwFileVersionLS;
  60. end;
  61. end;
  62. function StrToVersionNumbers(const S: String; var Version: TFileVersionNumbers): Boolean;
  63. function SplitNextNumber(var Z: String): Word;
  64. var
  65. I, N: Integer;
  66. begin
  67. if Trim(Z) <> '' then begin
  68. I := Pos('.', Z);
  69. if I = 0 then
  70. I := Length(Z)+1;
  71. N := StrToInt(Trim(Copy(Z, 1, I-1)));
  72. if (N < Low(Word)) or (N > High(Word)) then
  73. Abort;
  74. Result := N;
  75. Z := Copy(Z, I+1, Maxint);
  76. end else
  77. Result := 0;
  78. end;
  79. var
  80. Z: String;
  81. W: Word;
  82. begin
  83. try
  84. Z := S;
  85. W := SplitNextNumber(Z);
  86. Version.MS := (DWord(W) shl 16) or SplitNextNumber(Z);
  87. W := SplitNextNumber(Z);
  88. Version.LS := (DWord(W) shl 16) or SplitNextNumber(Z);
  89. Result := True;
  90. except
  91. Result := False;
  92. end;
  93. end;
  94. end.