#pragma once #ifndef _INC_SHLWAPI #include < Shlwapi.h > #endif #pragma comment (lib, "shlwapi.lib") #ifndef VER_H #include < WinVer.h > #endif #pragma comment (lib, "Version.lib ") //----------------------------------------------------------------------------- // FileVersion //----------------------------------------------------------------------------- class FileVersion { using XPCTSTR = const char *; public: FileVersion (); FileVersion (XPCTSTR lpszFileName); virtual ~FileVersion (); public: bool Open (IN XPCTSTR lpszFileName); void Close (void); public: inline bool IsValid () const; inline WORD GetVersionMajor () const; inline WORD GetVersionMinor () const; inline WORD GetVersionBuild () const; inline WORD GetVersionRevision () const; std::string GetVersionString () const; // return a string like 7.3.1.6 protected: bool GetVersionInfo (IN XPCTSTR lpszFileName); protected: bool m_bValid; // Version info is loaded VS_FIXEDFILEINFO m_vsffi; // Fixed File Info (FFI) }; // The format of the version number is as follows (optional components are shown in square brackets ([and]) : // major.minor [.build [.revision]] // HIWORD (ffi.dwFileVersionMS) - major // LOWORD (ffi.dwFileVersionMS) - minor // HIWORD (ffi.dwFileVersionLS) - build // LOWORD (ffi.dwFileVersionLS) - revision inline bool FileVersion::IsValid (void) const { return m_bValid; } inline WORD FileVersion::GetVersionMajor (void) const { ASSERT (m_bValid); return HIWORD (m_vsffi.dwFileVersionMS); } inline WORD FileVersion::GetVersionMinor (void) const { ASSERT (m_bValid); return LOWORD (m_vsffi.dwFileVersionMS); } inline WORD FileVersion::GetVersionBuild (void) const { ASSERT (m_bValid); return HIWORD (m_vsffi.dwFileVersionLS); } inline WORD FileVersion::GetVersionRevision (void) const { ASSERT (m_bValid); return LOWORD (m_vsffi.dwFileVersionLS); }