我的目标是在我的代码中检测Windows 10,该代码必须能够跨平台以及跨Windows的不同版本(至少7版及更高版本)运行。Windows提供IsWindows10OrGreater()
了解决此问题的方法,但是还有另一个问题,该功能在以前的Windows版本中不存在。
您会发现无数的博客和关于此的问题,以及明显的疯狂,其中诸如this和getversion之类的函数返回的版本有所不同,而不是正确的版本。
例如在我的机器上-该方法IsWindows10OrGreater()
无法编译(我必须安装Win10 SDK),并IsWindowsVersionOrGreater()
报告6
为主要版本。
那么,有没有一种明智的多版本方法可以解决此问题?
检索真实OS版本的最直接方法是调用RtlGetVersion。它是什么GetVersionEx
和VerifyVersionInfo
电话,但没有采用兼容性垫片。
您可以使用DDK(通过#include <ntddk.h>并从内核模式链接到NtosKrnl.lib,或从用户模式链接到ntdll.lib),或使用运行时动态链接,如以下代码段所示:
typedef LONG NTSTATUS, *PNTSTATUS;
#define STATUS_SUCCESS (0x00000000)
typedef NTSTATUS (WINAPI* RtlGetVersionPtr)(PRTL_OSVERSIONINFOW);
RTL_OSVERSIONINFOW GetRealOSVersion() {
HMODULE hMod = ::GetModuleHandleW(L"ntdll.dll");
if (hMod) {
RtlGetVersionPtr fxPtr = (RtlGetVersionPtr)::GetProcAddress(hMod, "RtlGetVersion");
if (fxPtr != nullptr) {
RTL_OSVERSIONINFOW rovi = { 0 };
rovi.dwOSVersionInfoSize = sizeof(rovi);
if ( STATUS_SUCCESS == fxPtr(&rovi) ) {
return rovi;
}
}
}
RTL_OSVERSIONINFOW rovi = { 0 };
return rovi;
}
如果需要其他信息,可以传递RTL_OSVERSIONINFOEXW结构代替RTL_OSVERSIONINFOW结构(正确分配dwOSVersionInfoSize成员)。
即使没有清单连接,这也会在Windows 10上返回预期的结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句