Shared.VerInfoFunc.pas 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. unit Shared.VerInfoFunc;
  2. {
  3. Inno Setup
  4. Copyright (C) 1997-2025 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;
  12. type
  13. TFileVersionNumbers = record
  14. MS, LS: UInt32;
  15. end;
  16. function GetVersionInfo(const Filename: String; var VersionInfo: TVSFixedFileInfo): Boolean;
  17. function GetVersionNumbers(const Filename: String; var VersionNumbers: TFileVersionNumbers): Boolean;
  18. function StrToVersionNumbers(const S: String; var Version: TFileVersionNumbers): Boolean;
  19. function VersionNumbersToInt64(const VersionNumbers: TFileVersionNumbers): Int64;
  20. implementation
  21. uses
  22. Shared.CommonFunc, Shared.FileClass;
  23. function GetVersionInfo(const Filename: String;
  24. var VersionInfo: TVSFixedFileInfo): Boolean;
  25. var
  26. VersionHandle: DWORD;
  27. VersionBuf: PChar;
  28. VerInfo: PVSFixedFileInfo;
  29. VerInfoSize: UINT;
  30. begin
  31. Result := False;
  32. const VersionSize = GetFileVersionInfoSize(PChar(Filename), VersionHandle);
  33. if VersionSize > 0 then begin
  34. GetMem(VersionBuf, VersionSize);
  35. try
  36. if GetFileVersionInfo(PChar(Filename), VersionHandle, VersionSize, VersionBuf) then begin
  37. if VerQueryValue(VersionBuf, '\', Pointer(VerInfo), VerInfoSize) then begin
  38. VersionInfo := VerInfo^;
  39. Result := True;
  40. end;
  41. end;
  42. finally
  43. FreeMem(VersionBuf);
  44. end;
  45. end;
  46. end;
  47. function GetVersionNumbers(const Filename: String;
  48. var VersionNumbers: TFileVersionNumbers): Boolean;
  49. var
  50. VerInfo: TVSFixedFileInfo;
  51. begin
  52. Result := GetVersionInfo(Filename, VerInfo);
  53. if Result then begin
  54. VersionNumbers.MS := VerInfo.dwFileVersionMS;
  55. VersionNumbers.LS := VerInfo.dwFileVersionLS;
  56. end;
  57. end;
  58. function StrToVersionNumbers(const S: String; var Version: TFileVersionNumbers): Boolean;
  59. function SplitNextNumber(var Z: String): UInt16;
  60. var
  61. I, N: Integer;
  62. begin
  63. if Trim(Z) <> '' then begin
  64. I := Pos('.', Z);
  65. if I = 0 then
  66. I := Length(Z)+1;
  67. N := StrToInt(Trim(Copy(Z, 1, I-1)));
  68. if (N < Low(UInt16)) or (N > High(UInt16)) then
  69. Abort;
  70. Result := UInt16(N);
  71. Z := Copy(Z, I+1, Maxint);
  72. end else
  73. Result := 0;
  74. end;
  75. var
  76. Z: String;
  77. W: Word;
  78. begin
  79. try
  80. Z := S;
  81. W := SplitNextNumber(Z);
  82. Version.MS := (UInt32(W) shl 16) or SplitNextNumber(Z);
  83. W := SplitNextNumber(Z);
  84. Version.LS := (UInt32(W) shl 16) or SplitNextNumber(Z);
  85. Result := True;
  86. except
  87. Result := False;
  88. end;
  89. end;
  90. function VersionNumbersToInt64(const VersionNumbers: TFileVersionNumbers): Int64;
  91. begin
  92. Result := HighLowToInt64(VersionNumbers.MS, VersionNumbers.LS);
  93. end;
  94. end.