admin 管理员组

文章数量: 887021

目录

1、系统API函数GetVersionEx已经被废弃,不能再使用了

2、不同版本的操作系统是如何区分的

3、调用API接口NetWkstaGetInfo,获取系统的版本号

4、代码示例

5、判断系统是32位还是64位的


VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn/chenlycly/article/details/125529931C/C++基础与进阶https://blog.csdn/chenlycly/category_11931267.htmlC++软件分析工具从入门到精通案例集锦(专栏文章正在更新中...)https://blog.csdn/chenlycly/article/details/131405795       有时候我们需要获取操作系统版本,比如win7、win8、win8.1、win10等,对不同版本的系统做特殊处理。有时我们还需要分辨当前系统是64位的,还是32位的。

1、系统API函数GetVersionEx已经被废弃,不能再使用了

        以前我们一般使用系统API函数GetVersionEx去获取操作系统版本,但从Windows8.1开始,该API函数就被微软废弃了,这点可以看MSDN上对该API函数的说明:

对于Windows 8.1以上的操作系统,该函数就获取不到正确的版本号了!

2、不同版本的操作系统是如何区分的

       操作系统有个主版本号MajorVersion,还有个子版本号MinorVersion,主要是将这个版本号组合起来判断系统版本的,如下:

    /*****************************************************************************
    Operating System             Version     PlatformID
    Windows 10                      10.0          VER_PLATFORM_WIN32_NT
    Windows 8.1                     6.3            VER_PLATFORM_WIN32_NT
    Windows 8                        6.2            VER_PLATFORM_WIN32_NT 
    Windows 7                        6.1            VER_PLATFORM_WIN32_NT
    Windows Vista                  6.0            VER_PLATFORM_WIN32_NT
    Windows XP 64-Bit Edition    5.2       VER_PLATFORM_WIN32_NT
    Windows XP                     5.1            VER_PLATFORM_WIN32_NT

    ******************************************************************************/

所以要判断操作系统版本,通过主版本号MajorVersion和子版本号MinorVersion就能确定了。

       这个地方需要注意一下,Win8系统有两个版本,一个是Windows 8(对应6.2),一个是Windows 8.1(对应6.3),所以要判断系统是否是Win8系统,需要考虑这两种情况。

3、调用API接口NetWkstaGetInfo,获取系统的版本号

      既然老的接口GetVersionEx不能再使用了,那应该使用哪个接口呢?经研究发现,我们可以调用API接口NetWkstaGetInfo。可以查看MSDN上对该API接口的说明:

在调用接口前,首先要包含lmwksta.h或Lm.h头文件,然后再引入Netapi32.lib库!

       调用接口的示例代码如下,判断是否是Win8以上的系统:

BOOL IsOsWin8OrAbove()
{
    BOOL bOSWin8OrAbove = FALSE;

	// 下面要调用NetWkstaGetInfo
	DWORD dwLevel = 100;
	LPWKSTA_INFO_100 lpWkStaInfo100 = NULL;
	NET_API_STATUS statusRet = NetWkstaGetInfo( NULL, dwLevel, (LPBYTE*)&lpWkStaInfo100 );
	if ( statusRet == NERR_Success )
	{
		// win8及以上版本
		if ( (lpWkStaInfo100->wki100_ver_major == 6 && lpWkStaInfo100->wki100_ver_minor >= 2) ||
			lpWkStaInfo100->wki100_ver_major > 6 )
		{
			bOSWin8OrAbove = TRUE;
		}
	}

	// Free the allocated memory
	if ( lpWkStaInfo100 != NULL )
	{
		NetApiBufferFree( lpWkStaInfo100 );
	}

	return bOSWin8OrAbove;
}

 注意,调用完NetWkstaGetInfo接口后,需要调用NetApiBufferFree将内存释放掉,因为调用NetWkstaGetInfo时传入的是LPWKSTA_INFO_100结构体指针,对应的内存是NetWkstaGetInfo函数内部分配的!

4、代码示例

       判断是否是Win7以上系统:

BOOL IsOsWin7OrAbove()
{
    BOOL bOSWin7OrAbove = FALSE;

	// 下面要调用NetWkstaGetInfo
	DWORD dwLevel = 100;
	LPWKSTA_INFO_100 lpWkStaInfo100 = NULL;
	NET_API_STATUS statusRet = NetWkstaGetInfo( NULL, dwLevel, (LPBYTE*)&lpWkStaInfo100 );
	if ( statusRet == NERR_Success )
	{
		// win8及以上版本
		if ( (lpWkStaInfo100->wki100_ver_major == 6 && lpWkStaInfo100->wki100_ver_minor >= 1) ||
			lpWkStaInfo100->wki100_ver_major > 6 )
		{
			bOSWin7OrAbove = TRUE;
		}
	}

	// Free the allocated memory
	if ( lpWkStaInfo100 != NULL )
	{
		NetApiBufferFree( lpWkStaInfo100 );
	}

	return bOSWin7OrAbove;
}

        判断是否是Win10及以上系统:

BOOL IsOsWin10OrAbove()
{
    BOOL bOSWin10OrAbove = FALSE;

	// 下面要调用NetWkstaGetInfo
	DWORD dwLevel = 100;
	LPWKSTA_INFO_100 lpWkStaInfo100 = NULL;
	NET_API_STATUS statusRet = NetWkstaGetInfo( NULL, dwLevel, (LPBYTE*)&lpWkStaInfo100 );
	if ( statusRet == NERR_Success )
	{
		// win8及以上版本
		if ( (lpWkStaInfo100->wki100_ver_major == 6 && lpWkStaInfo100->wki100_ver_minor >= 1) ||
			lpWkStaInfo100->wki100_ver_major > 6 )
		{
			bOSWin10OrAbove = TRUE;
		}
	}

	// Free the allocated memory
	if ( lpWkStaInfo100 != NULL )
	{
		NetApiBufferFree( lpWkStaInfo100 );
	}

	return bOSWin10OrAbove;
}

5、判断系统是32位还是64位的

       有时我们还需要判断当前系统是32的,还是64位的,可以调用GetNativeSystemInfo接口去判断,相关代码如下:

// 是否是64位操作系统
BOOL IsOS64()
{
	SYSTEM_INFO si = { 0 };
	GetNativeSystemInfo( &si );

	if ( si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64
		|| si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 )
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

本文标签: 系统 源码 Windows VC