VC++ 獲取Windows系統版本號、CPU名稱


轉載:https://blog.csdn.net/sunflover454/article/details/51525179

轉載:https://blog.csdn.net/magictong/article/details/40753519

轉載:https://blog.csdn.net/ryu2003/article/details/52064494

#include <iostream>
#include <Windows.h>
#include <atlstr.h>

#pragma warning(disable : 4996)

CString GetSystemName()
{
    SYSTEM_INFO info;        //用SYSTEM_INFO結構判斷64位AMD處理器   
    GetSystemInfo(&info);    //調用GetSystemInfo函數填充結構   
    OSVERSIONINFOEX os;
    os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

    CString osname = L"unknown OperatingSystem.";

    if (GetVersionEx((OSVERSIONINFO *)&os))
    {
        //下面根據版本信息判斷操作系統名稱   
        switch (os.dwMajorVersion)//判斷主版本號  
        {
        case 4:
            switch (os.dwMinorVersion)//判斷次版本號   
            {
            case 0:
                if (os.dwPlatformId == VER_PLATFORM_WIN32_NT)
                    osname = L"Microsoft Windows NT 4.0"; //1996年7月發布   
                else if (os.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
                    osname = L"Microsoft Windows 95";
                break;
            case 10:
                osname = L"Microsoft Windows 98";
                break;
            case 90:
                osname = L"Microsoft Windows Me";
                break;
            }
            break;

        case 5:
            switch (os.dwMinorVersion)   //再比較dwMinorVersion的值  
            {
            case 0:
                osname = L"Microsoft Windows 2000";//1999年12月發布  
                break;

            case 1:
                osname = L"Microsoft Windows XP";//2001年8月發布  
                break;

            case 2:
                if (os.wProductType == VER_NT_WORKSTATION
                    && info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
                {
                    osname = L"Microsoft Windows XP Professional x64 Edition";
                }
                else if (GetSystemMetrics(SM_SERVERR2) == 0)
                    osname = "Microsoft Windows Server 2003";//2003年3月發布   
                else if (GetSystemMetrics(SM_SERVERR2) != 0)
                    osname = L"Microsoft Windows Server 2003 R2";
                break;
            }
            break;

        case 6:
            switch (os.dwMinorVersion)
            {
            case 0:
                if (os.wProductType == VER_NT_WORKSTATION)
                    osname = L"Microsoft Windows Vista";
                else
                    osname = L"Microsoft Windows Server 2008";//服務器版本   
                break;
            case 1:
                if (os.wProductType == VER_NT_WORKSTATION)
                    osname = L"Microsoft Windows 7";
                else
                    osname = L"Microsoft Windows Server 2008 R2";
                break;
            case 2:
                if (os.wProductType == VER_NT_WORKSTATION)
                    osname = L"Microsoft Windows 8";
                else
                    osname = L"Microsoft Windows Server 2012";
                break;
            case 3:
                if (os.wProductType == VER_NT_WORKSTATION)
                    osname = L"Microsoft Windows 8.1";
                else
                    osname = L"Microsoft Windows Server 2012 R2";
                break;
            }
            break;

        case 10:
            switch (os.dwMinorVersion)
            {
            case 0:
                if (os.wProductType == VER_NT_WORKSTATION)
                    osname = L"Microsoft Windows 10";
                else
                    osname = L"Microsoft Windows Server 2016 Technical Preview";//服務器版本   
                break;
            }
            break;
        }
    }

    return osname;
}


int main()
{
    CString strOSversion = GetSystemName();


    return 0;
}

注:現在系統升級很快,這對軟件開發人員來說是個打擊,測試起來太麻煩,要考慮的兼容性問題也越來越多,坑也越來越多。。。
雖然核心代碼就一個函數:GetVersionEx,但是Win8.1和Win10獲取到的版本缺一直是6.2(Win8)

仔細閱讀微軟說明:https://msdn.microsoft.com/en-us/library/ms724832.aspx 

問題的原因:簡單講就是兼容問題。可以通過修改manifest文件解決,也可以采用新的API來獲取版本號。
由於新的API在低版本操作系統沒有,還要特別處理,我們干脆使用修改manifest文件的方法,提高程序自身的兼容性,從而得到正確的系統版本信息。

<?xml version="1.0" encoding="UTF-8"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
        <application> 
            <!-- Windows 10 --> 
            <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
            <!-- Windows 8.1 -->
            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
            <!-- Windows Vista -->
            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> 
            <!-- Windows 7 -->
            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
            <!-- Windows 8 -->
            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
        </application> 
    </compatibility>
</assembly> 

代碼不變,只需要把項目屬性設置一下就好了
配置目標那里選則所有配置,配置屬性->清單工具->輸入和輸出-附加清單文件 填寫compatibility.xml,並把這個文件拷貝到項目源代碼目錄。
具體設置如下圖所示:

 2.獲取CPU名稱、內核數目、主頻

轉載:https://blog.csdn.net/github_37567324/article/details/79925776

#include <iostream>
#include <Windows.h>

void GetCpuInfo(CString &chProcessorName, CString &chProcessorType, DWORD &dwNum, DWORD &dwMaxClockSpeed)
{
    CString strPath = _T("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0");//注冊表子鍵路徑  
    CRegKey regkey;//定義注冊表類對象  
    LONG lResult;//LONG型變量-反應結果  
    lResult = regkey.Open(HKEY_LOCAL_MACHINE, LPCTSTR(strPath), KEY_ALL_ACCESS); //打開注冊表鍵  
    if (lResult != ERROR_SUCCESS)
    {
        return;
    }
    WCHAR chCPUName[50] = { 0 };
    DWORD dwSize = 50;

    //獲取ProcessorNameString字段值  
    if (ERROR_SUCCESS == regkey.QueryStringValue(_T("ProcessorNameString"), chCPUName, &dwSize))
    {
        chProcessorName = chCPUName;
    }

    //查詢CPU主頻  
    DWORD dwValue;
    if (ERROR_SUCCESS == regkey.QueryDWORDValue(_T("~MHz"), dwValue))
    {
        dwMaxClockSpeed = dwValue;
    }
    regkey.Close();//關閉注冊表  
    //UpdateData(FALSE);  

    //獲取CPU核心數目  
    SYSTEM_INFO si;
    memset(&si, 0, sizeof(SYSTEM_INFO));
    GetSystemInfo(&si);
    dwNum = si.dwNumberOfProcessors;

    switch (si.dwProcessorType)
    {
    case PROCESSOR_INTEL_386:
    {
                                chProcessorType.Format(_T("Intel 386 processor"));
    }
        break;
    case PROCESSOR_INTEL_486:
    {
                                chProcessorType.Format(_T("Intel 486 Processor"));
    }
        break;
    case PROCESSOR_INTEL_PENTIUM:
    {
                                    chProcessorType.Format(_T("Intel Pentium Processor"));
    }
        break;
    case PROCESSOR_INTEL_IA64:
    {
                                 chProcessorType.Format(_T("Intel IA64 Processor"));
    }
        break;
    case PROCESSOR_AMD_X8664:
    {
                                chProcessorType.Format(_T("AMD X8664 Processor"));
    }
        break;
    default:
        chProcessorType.Format(_T("未知"));
        break;
    }
}



int main()
{

    CString chProcessorName, chProcessorType;
    DWORD dwNum, dwMaxClockSpeed;

    GetCpuInfo(chProcessorName,chProcessorType,dwNum,dwMaxClockSpeed);

    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM