Shared.VerInfoFunc.pas 2.5 KB

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