GetVersionExA() を直接使用するのをやめた
- warning C4996: 'GetVersionExA': が古い形式として宣言されました。
- /sdl オプションをつけるとエラーとなっていた
@@ -65,6 +65,7 @@ | ||
65 | 65 | static BOOL (WINAPI *pVerifyVersionInfoA)(LPOSVERSIONINFOEXA lpVersionInformation, DWORD dwTypeMask, DWORDLONG dwlConditionMask); |
66 | 66 | BOOL (WINAPI *pSetDefaultDllDirectories)(DWORD DirectoryFlags); |
67 | 67 | BOOL (WINAPI *pSetDllDirectoryA)(LPCSTR lpPathName); |
68 | +static BOOL (WINAPI *pGetVersionExA)(LPOSVERSIONINFOA lpVersionInformation); | |
68 | 69 | |
69 | 70 | // gdi32 |
70 | 71 | int (WINAPI *pAddFontResourceExW)(LPCWSTR name, DWORD fl, PVOID res); |
@@ -263,11 +264,47 @@ | ||
263 | 264 | {}, |
264 | 265 | }; |
265 | 266 | |
267 | +/* OS version with GetVersionEx(*1) | |
268 | + | |
269 | + dwMajorVersion dwMinorVersion dwPlatformId | |
270 | +Windows95 4 0 VER_PLATFORM_WIN32_WINDOWS | |
271 | +Windows98 4 10 VER_PLATFORM_WIN32_WINDOWS | |
272 | +WindowsMe 4 90 VER_PLATFORM_WIN32_WINDOWS | |
273 | +WindowsNT4.0 4 0 VER_PLATFORM_WIN32_NT | |
274 | +Windows2000 5 0 VER_PLATFORM_WIN32_NT | |
275 | +WindowsXP 5 1 VER_PLATFORM_WIN32_NT | |
276 | +WindowsXPx64 5 2 VER_PLATFORM_WIN32_NT | |
277 | +WindowsVista 6 0 VER_PLATFORM_WIN32_NT | |
278 | +Windows7 6 1 VER_PLATFORM_WIN32_NT | |
279 | +Windows8 6 2 VER_PLATFORM_WIN32_NT | |
280 | +Windows8.1(*2) 6 2 VER_PLATFORM_WIN32_NT | |
281 | +Windows8.1(*3) 6 3 VER_PLATFORM_WIN32_NT | |
282 | +Windows10(*2) 6 2 VER_PLATFORM_WIN32_NT | |
283 | +Windows10(*3) 10 0 VER_PLATFORM_WIN32_NT | |
284 | + | |
285 | +(*1) GetVersionEx()が c4996 warning となるのは、VS2013(_MSC_VER=1800) からです。 | |
286 | +(*2) manifestに supportedOS Id を追加していない。 | |
287 | +(*3) manifestに supportedOS Id を追加している。 | |
288 | +*/ | |
289 | +static BOOL _GetVersionExA(LPOSVERSIONINFOA lpVersionInformation) | |
290 | +{ | |
291 | + static OSVERSIONINFOA VersionInformation; | |
292 | + if (pGetVersionExA == NULL) { | |
293 | + // エラーが返ることはない (2022-08-04) | |
294 | + VersionInformation = *lpVersionInformation; | |
295 | + void **func = (void **) & pGetVersionExA; | |
296 | + DLLGetApiAddress(L"kernel32.dll", DLL_LOAD_LIBRARY_SYSTEM, "GetVersionExA", func); | |
297 | + pGetVersionExA(&VersionInformation); | |
298 | + } | |
299 | + *lpVersionInformation = VersionInformation; | |
300 | + return TRUE; | |
301 | +} | |
302 | + | |
266 | 303 | static bool IsWindowsNTKernel() |
267 | 304 | { |
268 | 305 | OSVERSIONINFOA osvi; |
269 | 306 | osvi.dwOSVersionInfoSize = sizeof(osvi); |
270 | - GetVersionExA(&osvi); | |
307 | + _GetVersionExA(&osvi); | |
271 | 308 | if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { |
272 | 309 | // Windows 9x |
273 | 310 | return false; |
@@ -281,7 +318,7 @@ | ||
281 | 318 | { |
282 | 319 | OSVERSIONINFOA osvi; |
283 | 320 | osvi.dwOSVersionInfoSize = sizeof(osvi); |
284 | - GetVersionExA(&osvi); | |
321 | + _GetVersionExA(&osvi); | |
285 | 322 | if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT && |
286 | 323 | osvi.dwMajorVersion == 4 && |
287 | 324 | osvi.dwMinorVersion == 0) { |
@@ -401,7 +438,7 @@ | ||
401 | 438 | BOOL ret, check_next; |
402 | 439 | |
403 | 440 | osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); |
404 | - GetVersionExA(&osvi); | |
441 | + _GetVersionExA(&osvi); | |
405 | 442 | |
406 | 443 | if (dwTypeMask & VER_BUILDNUMBER) { |
407 | 444 | cond = (WORD)((dwlConditionMask >> (2*3)) & 0x07); |
@@ -44,29 +44,6 @@ | ||
44 | 44 | #include "compat_win.h" |
45 | 45 | #include "codeconv.h" |
46 | 46 | |
47 | -/* OS version with GetVersionEx(*1) | |
48 | - | |
49 | - dwMajorVersion dwMinorVersion dwPlatformId | |
50 | -Windows95 4 0 VER_PLATFORM_WIN32_WINDOWS | |
51 | -Windows98 4 10 VER_PLATFORM_WIN32_WINDOWS | |
52 | -WindowsMe 4 90 VER_PLATFORM_WIN32_WINDOWS | |
53 | -WindowsNT4.0 4 0 VER_PLATFORM_WIN32_NT | |
54 | -Windows2000 5 0 VER_PLATFORM_WIN32_NT | |
55 | -WindowsXP 5 1 VER_PLATFORM_WIN32_NT | |
56 | -WindowsXPx64 5 2 VER_PLATFORM_WIN32_NT | |
57 | -WindowsVista 6 0 VER_PLATFORM_WIN32_NT | |
58 | -Windows7 6 1 VER_PLATFORM_WIN32_NT | |
59 | -Windows8 6 2 VER_PLATFORM_WIN32_NT | |
60 | -Windows8.1(*2) 6 2 VER_PLATFORM_WIN32_NT | |
61 | -Windows8.1(*3) 6 3 VER_PLATFORM_WIN32_NT | |
62 | -Windows10(*2) 6 2 VER_PLATFORM_WIN32_NT | |
63 | -Windows10(*3) 10 0 VER_PLATFORM_WIN32_NT | |
64 | - | |
65 | -(*1) GetVersionEx()が c4996 warning となるのは、VS2013(_MSC_VER=1800) からです。 | |
66 | -(*2) manifestに supportedOS Id を追加していない。 | |
67 | -(*3) manifestに supportedOS Id を追加している。 | |
68 | -*/ | |
69 | - | |
70 | 47 | // for isInvalidFileNameChar / replaceInvalidFileNameChar |
71 | 48 | static char *invalidFileNameChars = "\\/:*?\"<>|"; |
72 | 49 |
@@ -925,6 +902,11 @@ | ||
925 | 902 | OutputDebugStringA(tmp); |
926 | 903 | } |
927 | 904 | |
905 | +// 各バージョンチェックは直値にできるかもしれない | |
906 | +// 例 | |
907 | +// VS2013でビルドしたプログラムは、そもそも NT4.0 では動作しないため、 | |
908 | +// IsWindowsNT4() は常に FALSE を返す | |
909 | + | |
928 | 910 | // OSが WindowsNT カーネルかどうかを判別する。 |
929 | 911 | // |
930 | 912 | // return TRUE: NT kernel |
@@ -959,9 +941,6 @@ | ||
959 | 941 | // OSが WindowsNT4.0 かどうかを判別する。 |
960 | 942 | BOOL IsWindowsNT4() |
961 | 943 | { |
962 | - // VS2013以上だと GetVersionEx() が警告となるため、VerifyVersionInfo() を使う。 | |
963 | - // しかし、VS2013でビルドしたプログラムは、そもそも NT4.0 では動作しないため、 | |
964 | - // 無条件に FALSE を返してもよいかもしれない。 | |
965 | 944 | return IsWindowsVer(VER_PLATFORM_WIN32_NT, 4, 0); |
966 | 945 | } |
967 | 946 |