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. 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 (¤t_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