VC++获取操作系统的版本 GetVersionEx函数

原文链接: http://blog.sina.com.cn/s/blog_8a7012cf010189tn.html

函数:BOOL CSystemOperate::GetOSDisplayString( LPTSTR pszOS );

LPTSTR pszOS将保存操作系统的版本信息

实现如下:

BOOL CSystemOperate::GetOSDisplayString( LPTSTR pszOS )

{

OSVERSIONINFOEX osvi;

SYSTEM_INFO si;

PGNSI pGNSI;

PGPI pGPI;

BOOL bOsVersionInfoEx;

DWORD dwType;

ZeroMemory(&si, sizeof(SYSTEM_INFO));

ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));

osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )

return 1;

// Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.

pGNSI = (PGNSI) GetProcAddress(

GetModuleHandle(TEXT("kernel32.dll")),

"GetNativeSystemInfo");

if(NULL != pGNSI)

pGNSI(&si);

else GetSystemInfo(&si);

if ( VER_PLATFORM_WIN32_NT==osvi.dwPlatformId &&

osvi.dwMajorVersion > 4 )

{

StringCchCopy(pszOS, BUFSIZE, TEXT("Microsoft "));

// Test for the specific product.

if ( osvi.dwMajorVersion == 6 )

{

if( osvi.dwMinorVersion == 0 )

{

if( osvi.wProductType == VER_NT_WORKSTATION )

StringCchCat(pszOS, BUFSIZE, TEXT("Windows Vista "));

else StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2008 " ));

}

if ( osvi.dwMinorVersion == 1 )

{

if( osvi.wProductType == VER_NT_WORKSTATION )

StringCchCat(pszOS, BUFSIZE, TEXT("Windows 7 "));

else StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2008 R2 " ));

}

pGPI = (PGPI) GetProcAddress(

GetModuleHandle(TEXT("kernel32.dll")),

"GetProductInfo");

pGPI( osvi.dwMajorVersion, osvi.dwMinorVersion, 0, 0, &dwType);

switch( dwType )

{

case PRODUCT_ULTIMATE:

StringCchCat(pszOS, BUFSIZE, TEXT("Ultimate Edition" ));

break;

case PRODUCT_HOME_PREMIUM:

StringCchCat(pszOS, BUFSIZE, TEXT("Home Premium Edition" ));

break;

case PRODUCT_HOME_BASIC:

StringCchCat(pszOS, BUFSIZE, TEXT("Home Basic Edition" ));

break;

case PRODUCT_ENTERPRISE:

StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition" ));

break;

case PRODUCT_BUSINESS:

StringCchCat(pszOS, BUFSIZE, TEXT("Business Edition" ));

break;

case PRODUCT_STARTER:

StringCchCat(pszOS, BUFSIZE, TEXT("Starter Edition" ));

break;

case PRODUCT_CLUSTER_SERVER:

StringCchCat(pszOS, BUFSIZE, TEXT("Cluster Server Edition" ));

break;

case PRODUCT_DATACENTER_SERVER:

StringCchCat(pszOS, BUFSIZE, TEXT("Datacenter Edition" ));

break;

case PRODUCT_DATACENTER_SERVER_CORE:

StringCchCat(pszOS, BUFSIZE, TEXT("Datacenter Edition (core installation)" ));

break;

case PRODUCT_ENTERPRISE_SERVER:

StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition" ));

break;

case PRODUCT_ENTERPRISE_SERVER_CORE:

StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition (core installation)" ));

break;

case PRODUCT_ENTERPRISE_SERVER_IA64:

StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition for Itanium-based Systems" ));

break;

case PRODUCT_SMALLBUSINESS_SERVER:

StringCchCat(pszOS, BUFSIZE, TEXT("Small Business Server" ));

break;

case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:

StringCchCat(pszOS, BUFSIZE, TEXT("Small Business Server Premium Edition" ));

break;

case PRODUCT_STANDARD_SERVER:

StringCchCat(pszOS, BUFSIZE, TEXT("Standard Edition" ));

break;

case PRODUCT_STANDARD_SERVER_CORE:

StringCchCat(pszOS, BUFSIZE, TEXT("Standard Edition (core installation)" ));

break;

case PRODUCT_WEB_SERVER:

StringCchCat(pszOS, BUFSIZE, TEXT("Web Server Edition" ));

break;

}

}

if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )

{

if( GetSystemMetrics(SM_SERVERR2) )

StringCchCat(pszOS, BUFSIZE, TEXT( "Windows Server 2003 R2, "));

else if ( osvi.wSuiteMask==VER_SUITE_STORAGE_SERVER )

StringCchCat(pszOS, BUFSIZE, TEXT( "Windows Storage Server 2003"));

else if ( osvi.wSuiteMask==VER_SUITE_WH_SERVER )

StringCchCat(pszOS, BUFSIZE, TEXT( "Windows Home Server"));

else if( osvi.wProductType == VER_NT_WORKSTATION &&

si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)

{

StringCchCat(pszOS, BUFSIZE, TEXT( "Windows XP Professional x64 Edition"));

}

else StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2003, "));

// Test for the server type.

if ( osvi.wProductType != VER_NT_WORKSTATION )

{

if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64 )

{

if( osvi.wSuiteMask & VER_SUITE_DATACENTER )

StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter Edition for Itanium-based Systems" ));

else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )

StringCchCat(pszOS, BUFSIZE, TEXT( "Enterprise Edition for Itanium-based Systems" ));

}

else if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )

{

if( osvi.wSuiteMask & VER_SUITE_DATACENTER )

StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter x64 Edition" ));

else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )

StringCchCat(pszOS, BUFSIZE, TEXT( "Enterprise x64 Edition" ));

else StringCchCat(pszOS, BUFSIZE, TEXT( "Standard x64 Edition" ));

}

else

{

if ( osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER )

StringCchCat(pszOS, BUFSIZE, TEXT( "Compute Cluster Edition" ));

else if( osvi.wSuiteMask & VER_SUITE_DATACENTER )

StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter Edition" ));

else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )

StringCchCat(pszOS, BUFSIZE, TEXT( "Enterprise Edition" ));

else if ( osvi.wSuiteMask & VER_SUITE_BLADE )

StringCchCat(pszOS, BUFSIZE, TEXT( "Web Edition" ));

else StringCchCat(pszOS, BUFSIZE, TEXT( "Standard Edition" ));

}

}

}

if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )

{

StringCchCat(pszOS, BUFSIZE, TEXT("Windows XP "));

if( osvi.wSuiteMask & VER_SUITE_PERSONAL )

StringCchCat(pszOS, BUFSIZE, TEXT( "Home Edition" ));

else StringCchCat(pszOS, BUFSIZE, TEXT( "Professional" ));

}

if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )

{

StringCchCat(pszOS, BUFSIZE, TEXT("Windows 2000 "));

if ( osvi.wProductType == VER_NT_WORKSTATION )

{

StringCchCat(pszOS, BUFSIZE, TEXT( "Professional" ));

}

else

{

if( osvi.wSuiteMask & VER_SUITE_DATACENTER )

StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter Server" ));

else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )

StringCchCat(pszOS, BUFSIZE, TEXT( "Advanced Server" ));

else StringCchCat(pszOS, BUFSIZE, TEXT( "Server" ));

}

}

// Include service pack (if any) and build number.

if( _tcslen(osvi.szCSDVersion) > 0 )

{

StringCchCat(pszOS, BUFSIZE, TEXT(" ") );

StringCchCat(pszOS, BUFSIZE, osvi.szCSDVersion);

}

TCHAR buf[80];

StringCchPrintf( buf, 80, TEXT(" (build %d)"), osvi.dwBuildNumber);

StringCchCat(pszOS, BUFSIZE, buf);

if ( osvi.dwMajorVersion >= 6 )

{

if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )

StringCchCat(pszOS, BUFSIZE, TEXT( ", 64-bit" ));

else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL )

StringCchCat(pszOS, BUFSIZE, TEXT(", 32-bit"));

}

return TRUE;

}

else

{

printf( "This sample does not support this version of Windows.\n");

return FALSE;

}

}

在函数的前面需要定义如下宏:

#pragma comment(lib, "User32.lib")

#define BUFSIZE 256

#define PRODUCT_ULTIMATE                            0x00000001

#define PRODUCT_HOME_BASIC                          0x00000002

#define PRODUCT_HOME_PREMIUM                        0x00000003

#define PRODUCT_ENTERPRISE                          0x00000004

#define PRODUCT_HOME_BASIC_N                        0x00000005

#define PRODUCT_BUSINESS                            0x00000006

#define PRODUCT_STANDARD_SERVER                     0x00000007

#define PRODUCT_DATACENTER_SERVER                   0x00000008

#define PRODUCT_SMALLBUSINESS_SERVER                0x00000009

#define PRODUCT_ENTERPRISE_SERVER                   0x0000000A

#define PRODUCT_STARTER                             0x0000000B

#define PRODUCT_DATACENTER_SERVER_CORE              0x0000000C

#define PRODUCT_STANDARD_SERVER_CORE                0x0000000D

#define PRODUCT_ENTERPRISE_SERVER_CORE              0x0000000E

#define PRODUCT_ENTERPRISE_SERVER_IA64              0x0000000F

#define PRODUCT_BUSINESS_N                          0x00000010

#define PRODUCT_WEB_SERVER                          0x00000011

#define PRODUCT_CLUSTER_SERVER                      0x00000012

#define PRODUCT_HOME_SERVER                         0x00000013

#define PRODUCT_STORAGE_EXPRESS_SERVER              0x00000014

#define PRODUCT_STORAGE_STANDARD_SERVER             0x00000015

#define PRODUCT_STORAGE_WORKGROUP_SERVER            0x00000016

#define PRODUCT_STORAGE_ENTERPRISE_SERVER           0x00000017

#define PRODUCT_SERVER_FOR_SMALLBUSINESS            0x00000018

#define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM        0x00000019

#define PRODUCT_HOME_PREMIUM_N                      0x0000001A

#define PRODUCT_ENTERPRISE_N                        0x0000001B

#define PRODUCT_ULTIMATE_N                          0x0000001C

#define PRODUCT_WEB_SERVER_CORE                     0x0000001D

#define PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT    0x0000001E

#define PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY      0x0000001F

#define PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING     0x00000020

#define PRODUCT_SMALLBUSINESS_SERVER_PRIME          0x00000021

#define PRODUCT_HOME_PREMIUM_SERVER                 0x00000022

#define PRODUCT_SERVER_FOR_SMALLBUSINESS_V          0x00000023

#define PRODUCT_STANDARD_SERVER_V                   0x00000024

#define PRODUCT_DATACENTER_SERVER_V                 0x00000025

#define PRODUCT_ENTERPRISE_SERVER_V                 0x00000026

#define PRODUCT_DATACENTER_SERVER_CORE_V            0x00000027

#define PRODUCT_STANDARD_SERVER_CORE_V              0x00000028

#define PRODUCT_ENTERPRISE_SERVER_CORE_V            0x00000029

#define PRODUCT_HYPERV                              0x0000002A

#define SM_TABLETPC             86

#define SM_MEDIACENTER          87

#define SM_STARTER              88

#define SM_SERVERR2             89

#define VER_SERVER_NT                       0x80000000

#define VER_WORKSTATION_NT                  0x40000000

#define VER_SUITE_SMALLBUSINESS             0x00000001

#define VER_SUITE_ENTERPRISE                0x00000002

#define VER_SUITE_BACKOFFICE                0x00000004

#define VER_SUITE_COMMUNICATIONS            0x00000008

#define VER_SUITE_TERMINAL                  0x00000010

#define VER_SUITE_SMALLBUSINESS_RESTRICTED 0x00000020

#define VER_SUITE_EMBEDDEDNT                0x00000040

#define VER_SUITE_DATACENTER                0x00000080

#define VER_SUITE_SINGLEUSERTS              0x00000100

#define VER_SUITE_PERSONAL                  0x00000200

#define VER_SUITE_BLADE                     0x00000400

#define VER_SUITE_EMBEDDED_RESTRICTED       0x00000800

#define VER_SUITE_SECURITY_APPLIANCE        0x00001000

#define VER_SUITE_STORAGE_SERVER            0x00002000

#define VER_SUITE_COMPUTE_SERVER            0x00004000

#define VER_SUITE_WH_SERVER                 0x00008000

typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);

typedef BOOL (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD);

时间: 2024-10-01 06:39:05

VC++获取操作系统的版本 GetVersionEx函数的相关文章

NTDLL未文档化函数RtlGetNtVersionNumbers获取操作系统版本

作为新手,对获取操作系统版本号好奇过,因为曾经假象过一个场景:如果将来在windows xp环境下编译的程序,在windows xp跑会怎样, 在windows 2003,windows 7,windows 8又会怎样,如果程序在windows 7以上版本需要特殊处理又该怎样判断操作系统版本呢. 带着这个好奇也了解过GetVersion和GetVersionEx函数,他们的最低使用需求是Windows 2000,以下是一些官方的测试代码. GetVersion function #include

如何获得 Windows 操作系统的版本

很多时候我们需要知道Windows操作系统的版本,使用下面这个API函数可以做到. Option Explicit Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long Private Type OSVERSIONINFO dwOSVersionInfoSize As Long

VC和gcc在保证函数static变量线程安全性上的区别

VC和gcc不同,不能保证静态变量的线程安全性.这就给我们的程序带来了很大的安全隐患和诸多不便.这一点应该引起我们的重视!尤其是在构造函数耗时比较长的时候,很可能给程序带来意想不到的结果.本文从测试代码开始,逐步分析原理,最后给出解决方案. 多线程状态下,VC不能保证在使用函数的静态变量的时候,它的构造函数已经被执行完毕,下面是一段测试代码: class TestStatic { public: TestStatic() { Sleep(1000*10); m_num = 999; } publ

VC++6.0版本程序转成VS2010版

直接转换的时候遇到两个问题: 1.预编译头文件*.PCH找不到 2.static_cast": 无法从"void (__thiscall CView2::* )(void)"转换为"LRESULT (__thiscall CWnd::* 1.来源:http://www.zhuyanfeng.com/archives/2231 错误: fatal error C1083: 无法打开预编译头文件:"Debug\xxx.pch": No such fi

同一域名对应多个IP时,PHP获取远程网页内容的函数

同一域名对应多个IP时,PHP获取远程网页内容的函数 [文章作者:张宴 本文版本:v1.0 最后修改:2008.12.15 转载请注明原文链接:http://blog.zyan.cc/post/389/] PHP获取远程网页内容有多种方式,例如用自带的file_get_contents.fopen等函数. 引用 <?php echo file_get_contents("http://blog.zyan.cc/abc.php"); ?> 但是,在DNS轮询等负载均衡中,同一

IOS 获取系统版本字符串,并且转化成float类型

pcDuino3下支持mmc启动,官方的Uboot是采用SPL框架实现的,因为内部的SRAM空间达到32K,我们完全可以在这32K空间内编写一个完整可用小巧的bootloader来完成引导Linux kernel的目的. 我们首先介绍下SPL框架,可以先看下<GNU ARM汇编--(十八)u-boot-采用nand_spl方式的启动方法>和<GNU ARM汇编--(十九)u-boot-nand-spl启动过程分析>,NAND_SPL也算是SPL框架下的一种模式. 当使用Nand f

VC++获取IDC_EDIT的7种方法

VC++获取IDC_EDIT的7种方法 http://blog.csdn.net/baizengfei/article/details/7997618 //第一种方法 int number1, number2, number3; char char1[10], char2[10], char3[10]; GetDlgItem(IDC_EDIT1)->GetWindowText(cahr1, 10); GetDlgITem(IDC_EDIT2)->GetWindowText(char2, 10)

VC和LUA混合开发之VC程序调用Lua脚本函数

http://www.cnblogs.com/clever101/archive/2010/04/14/1712207.html 作者:朱金灿 来源:http://www.cnblogs.com/clever101/ Lua语言以其卓越的可扩展性.简单.高效率和与平台无关性在游戏领域得到广泛应用.今天花了一些时间学习VC和Lua如何混合开发,编写了一个小例程,和大家分享一下这方面的经验. 首先在http://www.lua.org/ftp/下载Lua的最新版本:lua-5.1.4.然后用VS C

获取windows版本信息

procedure TForm1.Button1Click(Sender: TObject); Var OSVI:OSVERSIONINFO; begin OSVI.dwOSversioninfoSize:=Sizeof(OSVERSIONINFO); GetVersionEx(OSVI); Caption:=IntToStr(OSVI.dwMinorVersion)+',' +IntToStr(OSVI.dwMinorVersion)+',' +IntToStr(OSVI.dwBuildNum