VC++获取Widnows操作系统版本(附源码)

Posted dvlinker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC++获取Widnows操作系统版本(附源码)相关的知识,希望对你有一定的参考价值。

      有时候我们需要获取操作系统版本,比如win7、win8、win8.1、win10等,对不同版本的系统做特殊处理。有时我们还需要分辨当前系统是64位的,还是32位的。

      调用API接口NetWkstaGetInfo可以获得系统的主版本好和次版本号,这样就能确定操作系统是win7还是win10系统了。在调用接口前,要包含lmwksta.h或Lm.h头文件,要引入Netapi32.lib库,可以在MSDN上查看NetWkstaGetInfo接口的说明页面,页面中有其依赖的头文件和库文件的说明,如下:

       有人会说,为啥要调用NetWkstaGetInfo接口,这个接口我们都没刚听说过,应该调用GetVersionEx API接口,这个接口是专门用来获取操作系统版本的。实际上,GetVersionEx接口已经被微软废弃了,无法获取到操作系统真实的版本号了,MSDN上已明确该函数被废弃了:

        至于如何确定系统是32位的还是64位的,我们可以调用API函数GetNativeSystemInfo来获取。注意此处的API函数是GetNativeSystemInfo,不是GetSystemInfo,使用GetSystemInfo是有问题的。

       下面详细给出获取操作系统版本的代码,重点关注一下NetWkstaGetInfo和GetNativeSystemInfo两个API函数的调用:

CString GetOsName()

    // 1、调用GetNativeSystemInfo确定系统是32位的还是64位的
	SYSTEM_INFO info;                                   
    GetNativeSystemInfo(&info);                          

	CString strOsVerName;

    // 2、调用NetWkstaGetInfo获取系统的版本号
	// 由于GetVersionEx在win8及以后系统获取的版本有问题,即使按照msdn中说明那样添加
	// manifest支持文件,也会受程序的兼容模式影响,导致GetVersionEx获取的版本号不对
	// 所以此处调用NetWkstaGetInfo获取系统的版本好
	DWORD dwLevel = 100;
	LPWKSTA_INFO_100 lpWkStaInfo100 = NULL;
	NET_API_STATUS statusRet = NetWkstaGetInfo( NULL, dwLevel, (LPBYTE*)&lpWkStaInfo100 );
	if ( statusRet == NERR_Success )
	
		os.dwMajorVersion = lpWkStaInfo100->wki100_ver_major;
		os.dwMinorVersion = lpWkStaInfo100->wki100_ver_minor;
	

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

	//下面根据版本信息判断操作系统名称

	switch(os.dwMajorVersion)                        //判断主版本号 
	case 4: 
		switch(os.dwMinorVersion)                //判断次版本号 
		case 0: 
			if(os.dwPlatformId==VER_PLATFORM_WIN32_NT) 
				strOsVerName=_T("Microsoft Windows NT 4.0");                //1996年7月发布 
			else if(os.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS) 
				strOsVerName=_T("Microsoft Windows 95"); 
			break; 
		case 10: 
			strOsVerName=_T("Microsoft Windows 98"); 
			break; 
		case 90: 
			strOsVerName=_T("Microsoft Windows Me"); 
			break; 
		 
		break; 

	case 5: 
		switch(os.dwMinorVersion)               //再比较dwMinorVersion的值 
		case 0: 
			strOsVerName=_T("Microsoft Windows 2000");                    //1999年12月发布 
			break; 
		case 1: 
			strOsVerName=_T("Microsoft Windows XP");                    //2001年8月发布 
			break; 
		case 2: 
			if(os.wProductType==VER_NT_WORKSTATION &&
				info.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)

				strOsVerName=_T("Microsoft Windows XP Professional x64 Edition"); 
			else if(GetSystemMetrics(SM_SERVERR2)==0) 
				strOsVerName=_T("Microsoft Windows Server 2003");        //2003年3月发布 
			else if(GetSystemMetrics(SM_SERVERR2)!=0) 
				strOsVerName=_T("Microsoft Windows Server 2003 R2"); 
			break; 
		 
		break; 

	case 6: 
		switch(os.dwMinorVersion) 
		case 0: 
			if(os.wProductType==VER_NT_WORKSTATION)/*

												   VER_NT_WORKSTATION是桌面系统 */
												   strOsVerName=_T("Microsoft Windows Vista"); 
			else 
				strOsVerName=_T("Microsoft Windows Server 2008");          //服务器版本 
			break; 
		case 1: 
			if(os.wProductType==VER_NT_WORKSTATION) 
				strOsVerName=_T("Microsoft Windows 7"); 
			else 
				strOsVerName=_T("Microsoft Windows Server 2008 R2"); 
			break; 
		case 2: 
			if(os.wProductType==VER_NT_WORKSTATION) 
				strOsVerName=_T("Microsoft Windows 8"); 
			else 
				strOsVerName=_T("Microsoft Windows Server 2012"); 
			break; 
		case 3: 
			if(os.wProductType==VER_NT_WORKSTATION) 
				strOsVerName=_T("Microsoft Windows 8.1"); 
			else 
				strOsVerName=_T("Microsoft Windows Server 2012 R2"); 
			break; 
		 
		break; 

	case 10: 
		switch(os.dwMinorVersion) 
		case 0: 
			strOsVerName = _T("Microsoft Windows 10");
			break;
		 
		break;
	default: 
		strOsVerName=_T(""); 
	 

	return strOsVerName;

以上是关于VC++获取Widnows操作系统版本(附源码)的主要内容,如果未能解决你的问题,请参考以下文章

VC++ 获取窗口的类名和窗口所属进程线程id(附源码)

VC++ 获取CPU的型号主频和核数(附源码)

VC++获取系统TCPUDP端口使用信息,并判断端口是否被占用(附源码)

VC++获取电脑的各个磁盘盘符及容量信息(附源码)

VC++如何实时监测另一个进程是否已经退出?(附源码)

VC++解决Windows快捷方式图标不刷新问题(附源码)