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.main
parent
c96bc8b1a2
commit
c0bfd8bafd
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue