Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ReSharper disable CppInconsistentNaming
- #pragma once
- #include <windows.h>
- #include <cstdint>
- #include <string>
- #include <memory>
- #pragma comment(lib, "version.lib")
- class BuildInfo
- {
- public:
- struct BuildInfoVersion
- {
- int32_t major;
- int32_t minor;
- int32_t bug_fix;
- int32_t build_number;
- bool operator ==(const BuildInfoVersion& o) const;
- bool operator !=(const BuildInfoVersion& o) const;
- };
- BuildInfo(int32_t majorNum, int32_t minorNum, int32_t bugFixNum, int32_t buildNum);
- BuildInfo();
- [[nodiscard]] auto version() const -> const BuildInfoVersion&;
- [[nodiscard]] auto toString() const -> const std::string&;
- private:
- auto initVersionString() -> void;
- BuildInfoVersion ver_{};
- std::string versionstring_;
- };
- inline bool BuildInfo::BuildInfoVersion::operator==(const BuildInfoVersion& o) const
- {
- return major == o.major && minor == o.minor && bug_fix == o.bug_fix && build_number == o.build_number;
- }
- inline bool BuildInfo::BuildInfoVersion::operator!=(const BuildInfoVersion& o) const
- {
- return !operator ==(o);
- }
- inline BuildInfo::BuildInfo(const int32_t majorNum, const int32_t minorNum, const int32_t bugFixNum, const int32_t buildNum):
- ver_{majorNum, minorNum, bugFixNum, buildNum}
- {
- initVersionString();
- }
- inline BuildInfo::BuildInfo()
- {
- #ifdef _MBCS
- CHAR dllPath[MAX_PATH] = { 0 };
- const auto slash = "\\";
- #else
- WCHAR dllPath[MAX_PATH] = { 0 };
- const auto slash = L"\\";
- #endif
- GetModuleFileName(GetModuleHandle(nullptr), dllPath, _countof(dllPath));
- DWORD verHandle = 0;
- UINT size = 0;
- LPBYTE lpBuffer = nullptr;
- const auto verSize = GetFileVersionInfoSize(dllPath, &verHandle);
- if (verSize)
- {
- const auto verData = std::make_unique<char[]>(verSize);
- if (GetFileVersionInfo(dllPath, verHandle, verSize, verData.get()) && VerQueryValue(
- verData.get(), slash, reinterpret_cast<LPVOID*>(&lpBuffer), &size))
- {
- if (size)
- {
- const auto verInfo = reinterpret_cast<VS_FIXEDFILEINFO*>(lpBuffer);
- if (verInfo->dwSignature == 0xFEEF04BD)
- {
- ver_.major = static_cast<int32_t>(verInfo->dwFileVersionMS) >> 16 & 0xFFFF;
- ver_.minor = static_cast<int32_t>(verInfo->dwFileVersionMS) >> 0 & 0xFFFF;
- ver_.bug_fix = static_cast<int32_t>(verInfo->dwFileVersionLS) >> 16 & 0xFFFF;
- ver_.build_number = static_cast<int32_t>(verInfo->dwFileVersionLS) >> 0 & 0xFFFF;
- initVersionString();
- }
- }
- }
- }
- }
- inline auto BuildInfo::version() const -> const BuildInfoVersion&
- {
- return ver_;
- }
- inline auto BuildInfo::toString() const -> const std::string&
- {
- return versionstring_;
- }
- inline auto BuildInfo::initVersionString() -> void
- {
- versionstring_ = (std::to_string(ver_.major) + "." +
- std::to_string(ver_.minor) + "." +
- std::to_string(ver_.bug_fix) + "." +
- std::to_string(ver_.build_number));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement