FileVersion.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #include "stdafx.h"
  2. #include <memory>
  3. #ifndef _T
  4. #ifndef _INC_TCHAR
  5. #include < TChar.h >
  6. #endif
  7. #endif
  8. #ifndef ASSERT
  9. #ifndef _INC_CRTDBG
  10. #include < CrtDbg.h >
  11. #endif
  12. #define ASSERT(x) _ASSERTE (x)
  13. #endif
  14. #include "FileVersion.hpp"
  15. #ifndef ASSERT_RETURN
  16. #define ASSERT_RETURN(x) { ASSERT (0); return x; }
  17. #endif
  18. //-----------------------------------------------------------------------------
  19. // FileVersion
  20. //-----------------------------------------------------------------------------
  21. FileVersion::FileVersion (void)
  22. {
  23. m_bValid = false;
  24. ::ZeroMemory (&m_vsffi, sizeof (m_vsffi));
  25. }
  26. FileVersion::FileVersion (XPCTSTR lpszFileName)
  27. {
  28. m_bValid = false;
  29. ::ZeroMemory (&m_vsffi, sizeof (m_vsffi));
  30. Open (lpszFileName);
  31. }
  32. FileVersion::~FileVersion (void)
  33. {
  34. Close ();
  35. }
  36. void FileVersion::Close (void)
  37. {
  38. m_bValid = false;
  39. ::ZeroMemory (&m_vsffi, sizeof (m_vsffi));
  40. }
  41. bool FileVersion::Open (IN XPCTSTR lpszFileName)
  42. {
  43. if (lpszFileName == nullptr)
  44. ASSERT_RETURN (FALSE);
  45. Close ();
  46. if (! GetVersionInfo (lpszFileName))
  47. Close ();
  48. return m_bValid;
  49. }
  50. bool FileVersion::GetVersionInfo (IN XPCTSTR FileName)
  51. {
  52. XPCTSTR lpszFileName = const_cast <XPCTSTR> (FileName);
  53. DWORD dwDummy = 0;
  54. int dwSize = ::GetFileVersionInfoSizeA (lpszFileName, &dwDummy);
  55. if (dwSize <= 0)
  56. return false;
  57. auto tmpBuf = std::unique_ptr <BYTE> (new BYTE [dwSize]);
  58. auto tmpVIB = tmpBuf.get ();
  59. if (tmpVIB == nullptr) return false;
  60. if (::GetFileVersionInfoA (lpszFileName, 0, dwSize, tmpVIB))
  61. {
  62. UINT uLen = 0;
  63. LPVOID lpVSFFI = nullptr;
  64. if (::VerQueryValue (tmpVIB, _T ("\\"), (LPVOID *) &lpVSFFI, &uLen)) // root
  65. {
  66. ::CopyMemory (&m_vsffi, lpVSFFI, sizeof (VS_FIXEDFILEINFO));
  67. m_bValid = (m_vsffi.dwSignature == VS_FFI_SIGNATURE);
  68. }
  69. }
  70. return m_bValid;
  71. }
  72. std::string FileVersion::GetVersionString () const
  73. {
  74. if (! m_bValid) return std::string ();
  75. return
  76. std::to_string (GetVersionMajor ()) + "." +
  77. std::to_string (GetVersionMinor ()) + "." +
  78. std::to_string (GetVersionBuild ()) + "." +
  79. std::to_string (GetVersionRevision ());
  80. }