Forráskód Böngészése

time: Only call GetSystemTimePreciseAsFileTime if available

GetSystemTimePreciseAsFileTime is only available on Win8/Server 2012 or higher, so it must be dynamically loaded and only used if available.  Fixes compatability with Win7 and XP.
Frank Praznik 1 éve
szülő
commit
c0bfd8bafd
1 módosított fájl, 18 hozzáadás és 1 törlés
  1. 18 1
      src/time/windows/SDL_systime.c

+ 18 - 1
src/time/windows/SDL_systime.c

@@ -32,6 +32,8 @@
 #define WINDOWS_TICK          10000000ULL
 #define UNIX_EPOCH_OFFSET_SEC 11644473600ULL
 
+typedef void(WINAPI *pfnGetSystemTimePreciseAsFileTime)(FILETIME *);
+
 void SDL_GetSystemTimeLocalePreferences(SDL_DATE_FORMAT *df, SDL_TIME_FORMAT *tf)
 {
     WCHAR str[80]; /* Per the docs, the time and short date format strings can be a max of 80 characters. */
@@ -77,14 +79,29 @@ found_date:
 
 int SDL_GetCurrentTime(SDL_Time *ticks)
 {
+    static pfnGetSystemTimePreciseAsFileTime pGetSystemTimePreciseAsFileTime = NULL;
+    static SDL_bool load_attempted = SDL_FALSE;
     FILETIME ft;
 
     if (!ticks) {
         return SDL_InvalidParamError("ticks");
     }
 
+    /* Only available in Win8/Server 2012 or higher. */
+    if (!pGetSystemTimePreciseAsFileTime && !load_attempted) {
+        HANDLE kernel32 = GetModuleHandle(TEXT("kernel32.dll"));
+        if (kernel32) {
+            pGetSystemTimePreciseAsFileTime = (pfnGetSystemTimePreciseAsFileTime)GetProcAddress(kernel32, "GetSystemTimePreciseAsFileTime");
+        }
+        load_attempted = SDL_TRUE;
+    }
+
     SDL_zero(ft);
-    GetSystemTimePreciseAsFileTime(&ft);
+    if (pGetSystemTimePreciseAsFileTime) {
+        pGetSystemTimePreciseAsFileTime(&ft);
+    } else {
+        GetSystemTimeAsFileTime(&ft);
+    }
     *ticks = SDL_TimeFromWindows(ft.dwLowDateTime, ft.dwHighDateTime);
 
     return 0;