On 2020-05-29 2:04, Bruno Haible wrote:
Hi,

Steve Lhomme wrote:
LoadLibrary is forbidden in such apps (can only load DLLs from within the app
package).
The API entries are available to all apps linking with the Windows API as found
here:
https://docs.microsoft.com/en-us/uwp/win32-and-com/win32-apis

Thanks for these infos.

+#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && _WIN32_WINNT >= 
0x0A00 /* _WIN32_WINNT_WIN10 */

The GetSystemTimePreciseAsFileTime function is available starting with Windows 
8,
therefore
   - the condition with WINAPI_FAMILY_PARTITION is not necessary,
   - the condition _WIN32_WINNT >= 0x0A00 is overly restrictive;
     _WIN32_WINNT >= _WIN32_WINNT_WIN8 will work just as well.

OK. I thought GetSystemTimePreciseAsFileTime was not available in Win8 UWP apps. But it seems it was: https://docs.microsoft.com/en-us/windows/win32/apiindex/windows-81-api-sets

I have added a page about the native Windows APIs at
https://gitlab.com/ghwiki/gnow-how/-/wikis/Platforms/Native_Windows

Then here is a patch to avoid LoadLibrary when possible.


2020-05-28  Bruno Haible  <br...@clisp.org>

        Avoid dynamic loading of Windows API functions when possible.
        Reported by Steve Lhomme <rob...@ycbcr.xyz> in
        <https://lists.gnu.org/archive/html/bug-gnulib/2020-05/msg00182.html>.
        * lib/gettimeofday.c (GetProcAddress,
        GetSystemTimePreciseAsFileTimeFuncType,
        GetSystemTimePreciseAsFileTimeFunc, initialized, initialize): Don't
        define in a build for Windows 8 or higher.
        * lib/isatty.c (GetProcAddress, GetNamedPipeClientProcessIdFuncType,
        GetNamedPipeClientProcessIdFunc, QueryFullProcessImageNameFuncType,
        QueryFullProcessImageNameFunc, initialized, initialize): Don't define
        in a build for Windows Vista or higher.
        * lib/stat-w32.c (GetProcAddress, GetFileInformationByHandleExFuncType,
        GetFileInformationByHandleExFunc, GetFinalPathNameByHandleFuncType,
        GetFinalPathNameByHandleFunc, initialized, initialize): Likewise.

diff --git a/lib/gettimeofday.c b/lib/gettimeofday.c
index 1980479..3d53115 100644
--- a/lib/gettimeofday.c
+++ b/lib/gettimeofday.c
@@ -33,9 +33,11 @@
#ifdef WINDOWS_NATIVE +# if !(_WIN32_WINNT >= _WIN32_WINNT_WIN8)
+
  /* Avoid warnings from gcc -Wcast-function-type.  */
-# define GetProcAddress \
-   (void *) GetProcAddress
+#  define GetProcAddress \
+    (void *) GetProcAddress
/* GetSystemTimePreciseAsFileTime was introduced only in Windows 8. */
  typedef void (WINAPI * GetSystemTimePreciseAsFileTimeFuncType) (FILETIME 
*lpTime);
@@ -54,6 +56,8 @@ initialize (void)
    initialized = TRUE;
  }
+# endif
+
  #endif
/* This is a wrapper for gettimeofday. It is used only on systems
@@ -84,8 +88,10 @@ gettimeofday (struct timeval *restrict tv, void *restrict tz)
       <http://www.windowstimestamp.com/description>.  */
    FILETIME current_time;
+# if !(_WIN32_WINNT >= _WIN32_WINNT_WIN8)
    if (!initialized)
      initialize ();
+# endif
    if (GetSystemTimePreciseAsFileTimeFunc != NULL)
      GetSystemTimePreciseAsFileTimeFunc (&current_time);
    else
diff --git a/lib/isatty.c b/lib/isatty.c
index 6cdc0fb..fc771d1 100644
--- a/lib/isatty.c
+++ b/lib/isatty.c
@@ -39,9 +39,11 @@
  # include <io.h>
  #endif
+#if !(_WIN32_WINNT >= _WIN32_WINNT_VISTA)
+
  /* Avoid warnings from gcc -Wcast-function-type.  */
-#define GetProcAddress \
-  (void *) GetProcAddress
+# define GetProcAddress \
+   (void *) GetProcAddress
/* GetNamedPipeClientProcessId was introduced only in Windows Vista. */
  typedef BOOL (WINAPI * GetNamedPipeClientProcessIdFuncType) (HANDLE hPipe,
@@ -69,6 +71,8 @@ initialize (void)
    initialized = TRUE;
  }
+#endif
+
  static BOOL IsConsoleHandle (HANDLE h)
  {
    DWORD mode;
@@ -84,8 +88,10 @@ static BOOL IsCygwinConsoleHandle (HANDLE h)
    BOOL result = FALSE;
    ULONG processId;
+#if !(_WIN32_WINNT >= _WIN32_WINNT_VISTA)
    if (!initialized)
      initialize ();
+#endif
/* GetNamedPipeClientProcessId
       
<https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-getnamedpipeclientprocessid>
diff --git a/lib/stat-w32.c b/lib/stat-w32.c
index b9163f5..02ad9ab 100644
--- a/lib/stat-w32.c
+++ b/lib/stat-w32.c
@@ -40,18 +40,20 @@
  #include "pathmax.h"
  #include "verify.h"
+#if !(_WIN32_WINNT >= _WIN32_WINNT_VISTA)
+
  /* Avoid warnings from gcc -Wcast-function-type.  */
-#define GetProcAddress \
-  (void *) GetProcAddress
+# define GetProcAddress \
+   (void *) GetProcAddress
-#if _GL_WINDOWS_STAT_INODES == 2
+# if _GL_WINDOWS_STAT_INODES == 2
  /* GetFileInformationByHandleEx was introduced only in Windows Vista.  */
  typedef DWORD (WINAPI * GetFileInformationByHandleExFuncType) (HANDLE hFile,
                                                                 
FILE_INFO_BY_HANDLE_CLASS fiClass,
                                                                 LPVOID 
lpBuffer,
                                                                 DWORD 
dwBufferSize);
  static GetFileInformationByHandleExFuncType GetFileInformationByHandleExFunc 
= NULL;
-#endif
+# endif
  /* GetFinalPathNameByHandle was introduced only in Windows Vista.  */
  typedef DWORD (WINAPI * GetFinalPathNameByHandleFuncType) (HANDLE hFile,
                                                             LPSTR lpFilePath,
@@ -66,16 +68,18 @@ initialize (void)
    HMODULE kernel32 = LoadLibrary ("kernel32.dll");
    if (kernel32 != NULL)
      {
-#if _GL_WINDOWS_STAT_INODES == 2
+# if _GL_WINDOWS_STAT_INODES == 2
        GetFileInformationByHandleExFunc =
          (GetFileInformationByHandleExFuncType) GetProcAddress (kernel32, 
"GetFileInformationByHandleEx");
-#endif
+# endif
        GetFinalPathNameByHandleFunc =
          (GetFinalPathNameByHandleFuncType) GetProcAddress (kernel32, 
"GetFinalPathNameByHandleA");
      }
    initialized = TRUE;
  }
+#endif
+
  /* Converts a FILETIME to GMT time since 1970-01-01 00:00:00.  */
  #if _GL_WINDOWS_STAT_TIMESPEC
  struct timespec
@@ -134,8 +138,10 @@ _gl_fstat_by_handle (HANDLE h, const char *path, struct 
stat *buf)
    DWORD type = GetFileType (h);
    if (type == FILE_TYPE_DISK)
      {
+#if !(_WIN32_WINNT >= _WIN32_WINNT_VISTA)
        if (!initialized)
          initialize ();
+#endif
/* st_mode can be determined through
           GetFileAttributesEx


Reply via email to