windows獲取系統(tǒng)版本號(hào)

需要在win7、windows server 2008、windows server 2012、win10上獲取系統(tǒng)的版本號(hào),綜合了各類方法,最終代碼如下所示,在4個(gè)平臺(tái)可用。

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

#define REG_NT_VERSION "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"

struct Info {
    char os_name[MAX_PATH];
    char installation[MAX_PATH];
    DWORD dwMajorVer, dwMinorVer, dwBuildNumber;
};

int get_os_info(Info& sysinfo, std::string& err) {
    HKEY hKey = NULL;
    LSTATUS lret = RegOpenKeyExA(
        HKEY_LOCAL_MACHINE,
        REG_NT_VERSION,
        0,
        KEY_READ,
        &hKey
    );
    if (lret != ERROR_SUCCESS) {
        char buf[1024];
        snprintf(buf, sizeof(buf), "RegOpenKeyExA error: %u", GetLastError());
        err = buf;
        return -1;
    }
    DWORD dwType = 0;
    DWORD dwSize = sizeof(sysinfo.os_name) / sizeof(sysinfo.os_name[0]);
    lret = RegQueryValueExA(hKey,
        "ProductName",
        NULL,
        &dwType,
        (LPBYTE)sysinfo.os_name,
        (DWORD*)&dwSize);
    if (lret != ERROR_SUCCESS) {
        char buf[1024];
        snprintf(buf, sizeof(buf), "RegQueryValueExA ProductName error: %u", GetLastError());
        err = buf;
        return -1;
    }
    dwSize = sizeof(sysinfo.installation) / sizeof(sysinfo.installation[0]);
    lret = RegQueryValueExA(hKey,
        "InstallationType",
        NULL,
        &dwType,
        (LPBYTE)sysinfo.installation,
        (DWORD*)&dwSize);
    if (lret != ERROR_SUCCESS) {
        char buf[1024];
        snprintf(buf, sizeof(buf), "RegQueryValueExA error: %u", GetLastError());
        err = buf;
        return -1;
    }
    RegCloseKey(hKey);

    BOOL bRet = FALSE;
    HMODULE hModNtdll = NULL;
    if (hModNtdll = ::LoadLibraryW(L"ntdll.dll"))
    {
        typedef void (WINAPI* pfRTLGETNTVERSIONNUMBERS)(DWORD*, DWORD*, DWORD*);
        pfRTLGETNTVERSIONNUMBERS pfRtlGetNtVersionNumbers;
        pfRtlGetNtVersionNumbers = (pfRTLGETNTVERSIONNUMBERS)::GetProcAddress(hModNtdll, "RtlGetNtVersionNumbers");
        if (pfRtlGetNtVersionNumbers)
        {
            pfRtlGetNtVersionNumbers(&sysinfo.dwMajorVer, &sysinfo.dwMinorVer, &sysinfo.dwBuildNumber);
            sysinfo.dwBuildNumber &= 0x0ffff;
            bRet = TRUE;
        }

        ::FreeLibrary(hModNtdll);
        hModNtdll = NULL;
    }
    if (!bRet) {
        char buf[1024];
        snprintf(buf, sizeof(buf), "get version error: %u", GetLastError());
        err = buf;
        return -1;
    }
    return 0;
}

int main()
{
    Info info = { 0 };
    std::string err;
    if (get_os_info(info, err)) {
        std::cerr << err << std::endl;
    }
    else {
        std::cout << "          OS: " << info.os_name << std::endl;
        std::cout << "Installation: " << info.installation << std::endl;
        std::cout << "    MajorVer: " << info.dwMajorVer << std::endl;
        std::cout << "    MinorVer: " << info.dwMinorVer << std::endl;
        std::cout << " BuildNumber: " << info.dwBuildNumber << std::endl;
    }
    char d;
    std::cin >> d;
    return 0;
}

采用VS2019編譯。
win10上運(yùn)行結(jié)果如下。


win10獲取版本號(hào).png

win7上結(jié)果如下。


win7獲取版本號(hào)

windows server 2008上結(jié)果如下。


server 2008獲取版本號(hào)

windows server 2012上結(jié)果如下。


server 2012獲取結(jié)果
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容