最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++獲取硬件參數(shù)的示例詳解

 更新時(shí)間:2024年11月20日 09:21:23   作者:阿征學(xué)IT  
這篇文章主要為大家詳細(xì)介紹了如何使用C++獲取硬件參數(shù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

分別顯示

cpu參數(shù)

顯卡參數(shù)

硬盤參數(shù)

內(nèi)存信息(隨機(jī)存儲(chǔ)器容量)

代碼

#include <iostream>
#include <comdef.h>
#include <Wbemidl.h>
 
#pragma comment(lib, "wbemuuid.lib")
 
void QueryWMI(IWbemServices* pSvc, const wchar_t* query, const wchar_t* propertyName) {
    IEnumWbemClassObject* pEnumerator = NULL;
    HRESULT hres = pSvc->ExecQuery(
        bstr_t("WQL"),
        bstr_t(query),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
        NULL,
        &pEnumerator);
 
    if (FAILED(hres)) {
        std::cerr << "Query failed. Error code = 0x" << std::hex << hres << std::endl;
        return;
    }
 
    IWbemClassObject* pclsObj = NULL;
    ULONG uReturn = 0;
 
    while (pEnumerator) {
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
 
        if (0 == uReturn) {
            break;
        }
 
        VARIANT vtProp;
        hr = pclsObj->Get(propertyName, 0, &vtProp, 0, 0);
        if (SUCCEEDED(hr) && vtProp.vt != VT_NULL) {
            std::wcout << propertyName << L" : " << vtProp.bstrVal << std::endl;
        }
        else {
            std::wcout << propertyName << L" : Not available" << std::endl;
        }
        VariantClear(&vtProp);
 
        pclsObj->Release();
    }
 
    pEnumerator->Release();
}
 
int main() {
    HRESULT hres;
 
    // Initialize COM.
    hres = CoInitializeEx(0, COINIT_MULTITHREADED);
    if (FAILED(hres)) {
        std::cerr << "Failed to initialize COM library. Error code = 0x" << std::hex << hres << std::endl;
        return 1;
    }
 
    // Initialize security.
    hres = CoInitializeSecurity(
        NULL,
        -1,
        NULL,
        NULL,
        RPC_C_AUTHN_LEVEL_DEFAULT,
        RPC_C_IMP_LEVEL_IMPERSONATE,
        NULL,
        EOAC_NONE,
        NULL);
 
    if (FAILED(hres)) {
        std::cerr << "Failed to initialize security. Error code = 0x" << std::hex << hres << std::endl;
        CoUninitialize();
        return 1;
    }
 
    IWbemLocator* pLoc = NULL;
    hres = CoCreateInstance(
        CLSID_WbemLocator,
        0,
        CLSCTX_INPROC_SERVER,
        IID_IWbemLocator, (LPVOID*)&pLoc);
 
    if (FAILED(hres)) {
        std::cerr << "Failed to create IWbemLocator object. Error code = 0x" << std::hex << hres << std::endl;
        CoUninitialize();
        return 1;
    }
 
    IWbemServices* pSvc = NULL;
    hres = pLoc->ConnectServer(
        _bstr_t(L"ROOT\\CIMV2"),
        NULL,
        NULL,
        0,
        NULL,
        0,
        0,
        &pSvc);
 
    if (FAILED(hres)) {
        std::cerr << "Could not connect. Error code = 0x" << std::hex << hres << std::endl;
        pLoc->Release();
        CoUninitialize();
        return 1;
    }
 
    hres = CoSetProxyBlanket(
        pSvc,
        RPC_C_AUTHN_WINNT,
        RPC_C_AUTHZ_NONE,
        NULL,
        RPC_C_AUTHN_LEVEL_CALL,
        RPC_C_IMP_LEVEL_IMPERSONATE,
        NULL,
        EOAC_NONE);
 
    if (FAILED(hres)) {
        std::cerr << "Could not set proxy blanket. Error code = 0x" << std::hex << hres << std::endl;
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return 1;
    }
 
    // Query hardware information
    std::wcout << L"CPU Information:" << std::endl;
    QueryWMI(pSvc, L"SELECT Name, NumberOfCores, MaxClockSpeed FROM Win32_Processor", L"Name");
 
    std::wcout << L"\nGPU Information:" << std::endl;
    QueryWMI(pSvc, L"SELECT Name, AdapterRAM, DriverVersion FROM Win32_VideoController", L"Name");
 
    std::wcout << L"\nDisk Information:" << std::endl;
    QueryWMI(pSvc, L"SELECT Model, Size, InterfaceType FROM Win32_DiskDrive", L"Model");
 
    std::wcout << L"\nMemory Information:" << std::endl;
    QueryWMI(pSvc, L"SELECT Capacity, Speed, Manufacturer FROM Win32_PhysicalMemory", L"Capacity");
 
    // Cleanup
    pSvc->Release();
    pLoc->Release();
    CoUninitialize();
 
    return 0;
}

頭文件部分

iostream:用于輸入輸出操作(std::wcout)。

comdef.h 和 Wbemidl.h:支持 COM(Component Object Model)和 WMI(Windows Management Instrumentation)接口。

#pragma comment(lib, "wbemuuid.lib"):將 wbemuuid.lib 動(dòng)態(tài)鏈接庫包含到項(xiàng)目中,這是 WMI 所需的庫。

函數(shù)部分

QueryWMI 函數(shù)

這是一個(gè)通用的函數(shù),用于執(zhí)行 WMI 查詢并獲取指定屬性的信息。

void QueryWMI(IWbemServices* pSvc, const wchar_t* query, const wchar_t* propertyName) {
    IEnumWbemClassObject* pEnumerator = NULL;
    HRESULT hres = pSvc->ExecQuery(
        bstr_t("WQL"),  // 使用 WMI Query Language (WQL)
        bstr_t(query),  // 執(zhí)行查詢字符串
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
        NULL,
        &pEnumerator);

輸入?yún)?shù)

pSvc:WMI 服務(wù)接口,用于執(zhí)行查詢。

query:WMI 查詢字符串,例如 SELECT Name FROM Win32_Processor。

propertyName:要獲取的屬性名,例如 Name。

WMI 查詢:

使用 IWbemServices::ExecQuery 執(zhí)行 WQL 查詢。

WBEM_FLAG_FORWARD_ONLY 和 WBEM_FLAG_RETURN_IMMEDIATELY 是優(yōu)化標(biāo)志,用于快速返回結(jié)果。

if (FAILED(hres)) {
    std::cerr << "Query failed. Error code = 0x" << std::hex << hres << std::endl;
    return;
}

檢查查詢是否成功,如果失敗,打印錯(cuò)誤代碼。

遍歷查詢結(jié)果

while (pEnumerator) {
    HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
    if (0 == uReturn) {
        break;
    }

使用 IEnumWbemClassObject::Next 獲取查詢結(jié)果,逐條處理

WBEM_INFINITE 指定無限等待時(shí)間

獲取指定屬性值

VARIANT vtProp;
hr = pclsObj->Get(propertyName, 0, &vtProp, 0, 0);
if (SUCCEEDED(hr) && vtProp.vt != VT_NULL) {
    std::wcout << propertyName << L" : " << vtProp.bstrVal << std::endl;
} else {
    std::wcout << propertyName << L" : Not available" << std::endl;
}
VariantClear(&vtProp);

調(diào)用 IWbemClassObject::Get 獲取指定屬性值

成功:打印屬性值

失敗或?qū)傩灾禐榭眨捍蛴?"Not available"。

用 VariantClear 釋放變量的內(nèi)存。

Main 函數(shù)

一,初始化 COM

hres = CoInitializeEx(0, COINIT_MULTITHREADED);

二,設(shè)置安全性

hres = CoInitializeSecurity(
    NULL,
    -1,
    NULL,
    NULL,
    RPC_C_AUTHN_LEVEL_DEFAULT,
    RPC_C_IMP_LEVEL_IMPERSONATE,
    NULL,
    EOAC_NONE,
    NULL);

配置 COM 安全性,確保當(dāng)前進(jìn)程有足夠權(quán)限訪問 WMI。

RPC_C_IMP_LEVEL_IMPERSONATE:允許服務(wù)器模擬客戶端

三,創(chuàng)建 WMI 接口對象

IWbemLocator* pLoc = NULL;
hres = CoCreateInstance(
    CLSID_WbemLocator,
    0,
    CLSCTX_INPROC_SERVER,
    IID_IWbemLocator, (LPVOID*)&pLoc);

使用 CoCreateInstance 創(chuàng)建 IWbemLocator 對象。該對象用于連接到 WMI 服務(wù)。

四,連接到 WMI 服務(wù)

hres = pLoc->ConnectServer(
    _bstr_t(L"ROOT\\CIMV2"),
    NULL,
    NULL,
    0,
    NULL,
    0,
    0,
    &pSvc);

連接到 ROOT\CIMV2 命名空間,這是獲取硬件信息的常用命名空間。

pSvc 是連接后的服務(wù)接口。

五,設(shè)置代理

hres = CoSetProxyBlanket(
    pSvc,
    RPC_C_AUTHN_WINNT,
    RPC_C_AUTHZ_NONE,
    NULL,
    RPC_C_AUTHN_LEVEL_CALL,
    RPC_C_IMP_LEVEL_IMPERSONATE,
    NULL,
    EOAC_NONE);

配置代理,為調(diào)用的 WMI 服務(wù)接口提供身份驗(yàn)證

六,查詢硬件信息

std::wcout << L"CPU Information:" << std::endl;
QueryWMI(pSvc, L"SELECT Name, NumberOfCores, MaxClockSpeed FROM Win32_Processor", L"Name");
 
std::wcout << L"\nGPU Information:" << std::endl;
QueryWMI(pSvc, L"SELECT Name, AdapterRAM, DriverVersion FROM Win32_VideoController", L"Name");
 
std::wcout << L"\nDisk Information:" << std::endl;
QueryWMI(pSvc, L"SELECT Model, Size, InterfaceType FROM Win32_DiskDrive", L"Model");
 
std::wcout << L"\nMemory Information:" << std::endl;
QueryWMI(pSvc, L"SELECT Capacity, Speed, Manufacturer FROM Win32_PhysicalMemory", L"Capacity");

調(diào)用 QueryWMI 函數(shù)分別獲取 CPU、GPU、硬盤和內(nèi)存的硬件信息。 

七,清理

pSvc->Release();
pLoc->Release();
CoUninitialize();

釋放 IWbemServices 和 IWbemLocator 接口。調(diào)用 CoUninitialize 關(guān)閉 COM。

運(yùn)行結(jié)果如下

以上就是C++獲取硬件參數(shù)的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于C++獲取硬件參數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • VS Code遠(yuǎn)程連接Linux服務(wù)器調(diào)試C程序的操作方法

    VS Code遠(yuǎn)程連接Linux服務(wù)器調(diào)試C程序的操作方法

    這篇文章主要介紹了VS Code遠(yuǎn)程連接Linux服務(wù)器調(diào)試C程序的操作方法,打開遠(yuǎn)程 Linux 服務(wù)器上的文件夾本文以 /root/ 為例,給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-12-12
  • C++11新特性之lambda、包裝器詳解

    C++11新特性之lambda、包裝器詳解

    lambda表達(dá)式是一種匿名函數(shù)對象,可以定義在函數(shù)內(nèi)部,用于定義輕量級的局部小函數(shù),本文給大家介紹C++11新特性之lambda、包裝器的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • MFC命名規(guī)則匯總

    MFC命名規(guī)則匯總

    這篇文章主要介紹了MFC命名規(guī)則,對于初學(xué)者而言需要牢固掌握這類規(guī)則,需要的朋友可以參考下
    2014-07-07
  • 基于Matlab實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)交通標(biāo)志識(shí)別

    基于Matlab實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)交通標(biāo)志識(shí)別

    道路交通標(biāo)志用以禁止、警告、指示和限制道路使用者有秩序地使用道路,?保障出行安全.若能自動(dòng)識(shí)別道路交通標(biāo)志,?則將極大減少道路交通事故的發(fā)生。本文將介紹基于Matlab實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)交通標(biāo)志識(shí)別,感興趣的可以學(xué)習(xí)一下
    2022-01-01
  • C++程序自動(dòng)重啟的實(shí)現(xiàn)代碼

    C++程序自動(dòng)重啟的實(shí)現(xiàn)代碼

    自動(dòng)重啟原理很簡單,用一個(gè)進(jìn)程監(jiān)控另一個(gè)進(jìn)程,掛了就再啟動(dòng)一個(gè),細(xì)節(jié)也不算多,主要是正確判斷進(jìn)程狀態(tài)和啟動(dòng)方式,本文就給大家講講C++程序自動(dòng)重啟的實(shí)現(xiàn)方法,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-04-04
  • 深入理解void以及void指針的含義

    深入理解void以及void指針的含義

    本篇文章對小編void以及void指針的含義進(jìn)行了詳細(xì)的分析和介紹。需要的朋友參考下
    2013-05-05
  • C語言數(shù)組的各種操作梳理

    C語言數(shù)組的各種操作梳理

    數(shù)組是一組有序的數(shù)據(jù)的集合,數(shù)組中元素類型相同,由數(shù)組名和下標(biāo)唯一地確定,數(shù)組中數(shù)據(jù)不僅數(shù)據(jù)類型相同,而且在計(jì)算機(jī)內(nèi)存里連續(xù)存放,地址編號最低的存儲(chǔ)單元存放數(shù)組的起始元素,地址編號最高的存儲(chǔ)單元存放數(shù)組的最后一個(gè)元素
    2022-04-04
  • C語言代碼實(shí)現(xiàn)通訊錄管理系統(tǒng)

    C語言代碼實(shí)現(xiàn)通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言代碼實(shí)現(xiàn)通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++?STL容器詳解之紅黑樹部分模擬實(shí)現(xiàn)

    C++?STL容器詳解之紅黑樹部分模擬實(shí)現(xiàn)

    本文主要對紅黑樹進(jìn)行了詳細(xì)介紹,并對其核心功能進(jìn)行了模擬實(shí)現(xiàn)。文中的代碼對我們的學(xué)習(xí)或工作有一定的價(jià)值,感興趣的小伙伴可以了解一下
    2021-12-12
  • for循環(huán)中刪除map中的元素valgrind檢測提示error:Invalid read of size 8

    for循環(huán)中刪除map中的元素valgrind檢測提示error:Invalid read of size 8

    這篇文章主要介紹了for循環(huán)中刪除map中的元素valgrind檢測提示error:Invalid read of size 8 的相關(guān)資料,需要的朋友可以參考下
    2016-07-07

最新評論

高密市| 安吉县| 龙门县| 蒙自县| 丰都县| 彭水| 晴隆县| 兴安县| 张北县| 老河口市| 阿拉善右旗| 朝阳市| 社旗县| 南雄市| 海口市| 蕉岭县| 桂东县| 梁山县| 汉寿县| 长沙市| 林州市| 花垣县| 安吉县| 聂拉木县| 晋江市| 奉贤区| 普兰店市| 辛集市| 白银市| 芷江| 兴宁市| 阿巴嘎旗| 县级市| 宝清县| 连山| 滨州市| 方正县| 日照市| 定结县| 治县。| 阳春市|