OSDN Git Service

Eliminate use of deprecated `GetVersionEx()`
authorGreyMerlin <GreyMerlin@gmail.com>
Thu, 26 Jul 2018 02:20:17 +0000 (19:20 -0700)
committerGreyMerlin <GreyMerlin@gmail.com>
Thu, 26 Jul 2018 19:37:51 +0000 (12:37 -0700)
* Add "Win_VersionHelper.h" to implement the proper modern runtime
checking for the Windows version.

* Unrelated: <mbstring.h> is useless in a UNICODE application.

Src/DirTravel.cpp
Src/Merge.vs2017.vcxproj
Src/Merge.vs2017.vcxproj.filters
Src/Win_VersionHelper.h [new file with mode: 0644]

index 93af3f1..defcc3e 100644 (file)
 #include <Poco/Timestamp.h>
 #include <windows.h>
 #include <tchar.h>
-#include <mbstring.h>
 #include "TFile.h"
 #include "UnicodeString.h"
 #include "DirItem.h"
 #include "unicoder.h"
 #include "paths.h"
+#include "Win_VersionHelper.h"
 
 using Poco::DirectoryIterator;
 using Poco::Timestamp;
@@ -83,11 +83,7 @@ static void LoadFiles(const String& sDir, DirItemArray * dirs, DirItemArray * fi
 
        WIN32_FIND_DATA ff;
        HANDLE h;
-       OSVERSIONINFO vi;
-       vi.dwOSVersionInfoSize = sizeof(vi);
-       GetVersionEx(&vi);
-
-       if (vi.dwMajorVersion * 10 + vi.dwMinorVersion >= 61)
+       if (IsWin7_OrGreater()) // (also 'Windows Server 2008 R2' and greater) for FIND_FIRST_EX_LARGE_FETCH
                h = FindFirstFileEx(TFile(sPattern).wpath().c_str(), FindExInfoBasic, &ff, FindExSearchNameMatch, NULL, FIND_FIRST_EX_LARGE_FETCH);
        else
                h = FindFirstFile(TFile(sPattern).wpath().c_str(), &ff);
index b0d552f..cc3e921 100644 (file)
     <ClInclude Include="Common\VersionInfo.h" />\r
     <ClInclude Include="VSSHelper.h" />\r
     <ClInclude Include="VssPromptDlg.h" />\r
+    <ClInclude Include="Win_VersionHelper.h" />\r
     <ClInclude Include="WMGotoDlg.h" />\r
     <ClInclude Include="diffutils\lib\cmpbuf.h" />\r
     <ClInclude Include="diffutils\config.h" />\r
index c0fcb89..2264955 100644 (file)
     <ClInclude Include="..\Externals\gtest\include\gtest\gtest.h">\r
       <Filter>MergeTest</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="Win_VersionHelper.h">\r
+      <Filter>Header Files</Filter>\r
+    </ClInclude>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <None Include="res\binarydiff.ico">\r
diff --git a/Src/Win_VersionHelper.h b/Src/Win_VersionHelper.h
new file mode 100644 (file)
index 0000000..746dd4b
--- /dev/null
@@ -0,0 +1,39 @@
+/** 
+ * @file  Win_VersionHelper.h
+ *
+ * @brief Defines quick-and-dirty runtime Windows version checking.
+
+ * All we need in WinMerge is `IsWin7_OrGreater()`
+ * But other possibilities (and slightly different implementation) can be seen in ...
+ *             'C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\um\VersionHelpers.h'
+ *
+ */
+
+#pragma once
+
+#include <windows.h>
+
+inline bool
+IsWinVer_OrGreater(WORD wVersion, WORD wServicePack = 0)
+{
+       DWORDLONG dwlConditionMask = 0; 
+       VER_SET_CONDITION( dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL );
+       VER_SET_CONDITION( dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL );
+       VER_SET_CONDITION( dwlConditionMask, VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL );
+
+       OSVERSIONINFOEXW osvi;
+       ::ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
+       osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
+       osvi.dwMajorVersion = HIBYTE(wVersion);
+       osvi.dwMinorVersion = LOBYTE(wVersion);
+       osvi.wServicePackMajor = wServicePack;
+
+       return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE;
+}
+
+
+inline bool
+IsWin7_OrGreater()
+{
+    return IsWinVer_OrGreater( _WIN32_WINNT_WIN7 );
+}