Win32OperatingSystem.st
changeset 23131 5782474bd56b
parent 23130 48acb2bbb580
child 23136 bf4d9f8dba5b
--- a/Win32OperatingSystem.st	Tue Jun 26 17:23:07 2018 +0200
+++ b/Win32OperatingSystem.st	Tue Jun 26 17:32:15 2018 +0200
@@ -11433,9 +11433,31 @@
 %{
     FILETIME fileTime;
 
+#ifdef OLD
     GetSystemTimeAsFileTime(&fileTime);
-// This will be available starting with Windows 8
-//    GetSystemTimePreciseAsFileTime(&fileTime);
+#else
+    // starting with Windows 8, this:
+    //    GetSystemTimePreciseAsFileTime(&fileTime);
+    // is better.
+    {
+	typedef VOID (WINAPI *P_GetSystemTimePreciseAsFileTime)(LPFILETIME);
+	static P_GetSystemTimePreciseAsFileTime pGetSystemTimePreciseAsFileTime = NULL;
+
+	if (pGetSystemTimePreciseAsFileTime == NULL) {
+	    pGetSystemTimePreciseAsFileTime =
+		(P_GetSystemTimePreciseAsFileTime)
+		    GetProcAddress ( GetModuleHandle ("kernel32.dll"),
+				     "GetSystemTimePreciseAsFileTime");
+
+	    if (pGetSystemTimePreciseAsFileTime == NULL) {
+		"/ use low resolution fallback
+		pGetSystemTimePreciseAsFileTime = GetSystemTimeAsFileTime;
+	    }
+	}
+
+	(*pGetSystemTimePreciseAsFileTime)(&fileTime);
+    }
+#endif
     nanosecondTime = FileTimeToNanosecondTime1970(&fileTime);
 %}.
     "/ rebias to 1970 by subtracting the number of millis from 1.1.1601 to 1.1.1970