我正在尝试在Windows 10计算机上使用C#获取Windows版本。
我总是得到这些值(使用C#\C++):
这是Windows 8操作系统accordingly to MSDN
C#代码:
var major = OperatingSystem.Version.Major
var minor = OperatingSystem.Version.Minor
C++代码
void print_os_info()
{
//http://stackoverflow.com/questions/1963992/check-windows-version
OSVERSIONINFOW info;
ZeroMemory(&info, sizeof(OSVERSIONINFOW));
info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
LPOSVERSIONINFOW lp_info = &info;
GetVersionEx(lp_info);
printf("Windows version: %u.%u\n", info.dwMajorVersion, info.dwMinorVersion);
}
Windows 10可能具有以下功能:
我在这里想念什么?
最佳答案
由于可接受的答案仅适用于C#,因此这里是C++的解决方案。
它在ntdll.dll中使用RtlGetVersion,该dll与GetVersionEx使用相同的结构(名称不同,但元素相同),并为您提供正确的版本。
由于此函数通常用于驱动程序开发,因此该函数在DDK中声明,而不在SDK中声明。因此,我使用了动态解决方案来调用该函数。
请注意,每次调用都会加载并释放ntdll.dll。因此,如果您更经常需要该功能,请保持加载库。
pOSversion指向的结构必须像GetVersionEx一样进行初始化。
BOOL GetTrueWindowsVersion(OSVERSIONINFOEX* pOSversion)
{
// Function pointer to driver function
NTSTATUS (WINAPI *pRtlGetVersion)(
PRTL_OSVERSIONINFOW lpVersionInformation) = NULL;
// load the System-DLL
HINSTANCE hNTdllDll = LoadLibrary("ntdll.dll");
// successfully loaded?
if (hNTdllDll != NULL)
{
// get the function pointer to RtlGetVersion
pRtlGetVersion = (NTSTATUS (WINAPI *)(PRTL_OSVERSIONINFOW))
GetProcAddress (hNTdllDll, "RtlGetVersion");
// if successfull then read the function
if (pRtlGetVersion != NULL)
pRtlGetVersion((PRTL_OSVERSIONINFOW)pOSversion);
// free the library
FreeLibrary(hNTdllDll);
} // if (hNTdllDll != NULL)
// if function failed, use fallback to old version
if (pRtlGetVersion == NULL)
GetVersionEx((OSVERSIONINFO*)pOSversion);
// always true ...
return (TRUE);
} // GetTrueWindowsVersion