Advertisement
Icesythe7

BuildInfo Class

Apr 4th, 2020
515
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.83 KB | None | 0 0
  1. // ReSharper disable CppInconsistentNaming
  2. #pragma once
  3. #include <windows.h>
  4. #include <cstdint>
  5. #include <string>
  6. #include <memory>
  7. #pragma comment(lib, "version.lib")
  8.  
  9. class BuildInfo
  10. {
  11. public:
  12.     struct BuildInfoVersion
  13.     {
  14.         int32_t major;
  15.         int32_t minor;
  16.         int32_t bug_fix;
  17.         int32_t build_number;
  18.  
  19.         bool operator ==(const BuildInfoVersion& o) const;
  20.         bool operator !=(const BuildInfoVersion& o) const;
  21.     };
  22.  
  23.     BuildInfo(int32_t majorNum, int32_t minorNum, int32_t bugFixNum, int32_t buildNum);
  24.  
  25.     BuildInfo();
  26.    
  27.     [[nodiscard]] auto version() const -> const BuildInfoVersion&;
  28.  
  29.     [[nodiscard]] auto toString() const -> const std::string&;
  30.  
  31. private:
  32.     auto initVersionString() -> void;
  33.  
  34.     BuildInfoVersion ver_{};
  35.     std::string versionstring_;
  36. };
  37.  
  38. inline bool BuildInfo::BuildInfoVersion::operator==(const BuildInfoVersion& o) const
  39. {
  40.     return major == o.major && minor == o.minor && bug_fix == o.bug_fix && build_number == o.build_number;
  41. }
  42.  
  43. inline bool BuildInfo::BuildInfoVersion::operator!=(const BuildInfoVersion& o) const
  44. {
  45.     return !operator ==(o);
  46. }
  47.  
  48. inline BuildInfo::BuildInfo(const int32_t majorNum, const int32_t minorNum, const int32_t bugFixNum, const int32_t buildNum):
  49. ver_{majorNum, minorNum, bugFixNum, buildNum}
  50. {
  51.     initVersionString();
  52. }
  53.  
  54. inline BuildInfo::BuildInfo()
  55. {
  56. #ifdef _MBCS
  57.     CHAR dllPath[MAX_PATH] = { 0 };
  58.     const auto slash = "\\";
  59. #else
  60.     WCHAR dllPath[MAX_PATH] = { 0 };
  61.     const auto slash = L"\\";
  62. #endif
  63.  
  64.     GetModuleFileName(GetModuleHandle(nullptr), dllPath, _countof(dllPath));
  65.     DWORD verHandle = 0;
  66.     UINT size = 0;
  67.     LPBYTE lpBuffer = nullptr;
  68.     const auto verSize = GetFileVersionInfoSize(dllPath, &verHandle);
  69.     if (verSize)
  70.     {
  71.         const auto verData = std::make_unique<char[]>(verSize);
  72.  
  73.         if (GetFileVersionInfo(dllPath, verHandle, verSize, verData.get()) && VerQueryValue(
  74.             verData.get(), slash, reinterpret_cast<LPVOID*>(&lpBuffer), &size))
  75.         {
  76.             if (size)
  77.             {
  78.                 const auto verInfo = reinterpret_cast<VS_FIXEDFILEINFO*>(lpBuffer);
  79.                 if (verInfo->dwSignature == 0xFEEF04BD)
  80.                 {
  81.                     ver_.major = static_cast<int32_t>(verInfo->dwFileVersionMS) >> 16 & 0xFFFF;
  82.                     ver_.minor = static_cast<int32_t>(verInfo->dwFileVersionMS) >> 0 & 0xFFFF;
  83.                     ver_.bug_fix = static_cast<int32_t>(verInfo->dwFileVersionLS) >> 16 & 0xFFFF;
  84.                     ver_.build_number = static_cast<int32_t>(verInfo->dwFileVersionLS) >> 0 & 0xFFFF;
  85.                     initVersionString();
  86.                 }
  87.             }
  88.         }
  89.     }
  90. }
  91.  
  92. inline auto BuildInfo::version() const -> const BuildInfoVersion&
  93. {
  94.     return ver_;
  95. }
  96.  
  97. inline auto BuildInfo::toString() const -> const std::string&
  98. {
  99.     return versionstring_;
  100. }
  101.  
  102. inline auto BuildInfo::initVersionString() -> void
  103. {
  104.     versionstring_ = (std::to_string(ver_.major) + "." +
  105.         std::to_string(ver_.minor) + "." +
  106.         std::to_string(ver_.bug_fix) + "." +
  107.         std::to_string(ver_.build_number));
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement