欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

分別顯示

cpu參數(shù)

顯卡參數(shù)

硬盤(pán)參數(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)鏈接庫(kù)包含到項(xiàng)目中,這是 WMI 所需的庫(kù)。

函數(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 指定無(wú)限等待時(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)限訪問(wèn) WMI。

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

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

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

使用 CoCreateInstance 創(chuàng)建 IWbemLocator 對(duì)象。該對(duì)象用于連接到 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、硬盤(pán)和內(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ù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++實(shí)現(xiàn)LeetCode(103.二叉樹(shù)的之字形層序遍歷)

    C++實(shí)現(xiàn)LeetCode(103.二叉樹(shù)的之字形層序遍歷)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(103.二叉樹(shù)的之字形層序遍歷),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言實(shí)現(xiàn)散列表(哈希Hash表)實(shí)例詳解

    C語(yǔ)言實(shí)現(xiàn)散列表(哈希Hash表)實(shí)例詳解

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)散列表(哈希Hash表)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 淺析直接插入排序與折半插入排序

    淺析直接插入排序與折半插入排序

    這篇文章主要介紹了直接插入排序與折半插入排序,有需要的朋友可以參考一下
    2013-12-12
  • C++中地圖按鍵排序?qū)崿F(xiàn)示例

    C++中地圖按鍵排序?qū)崿F(xiàn)示例

    這篇文章主要為大家介紹了C++中地圖按鍵排序?qū)崿F(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • c語(yǔ)言動(dòng)態(tài)內(nèi)存分配知識(shí)點(diǎn)及實(shí)例

    c語(yǔ)言動(dòng)態(tài)內(nèi)存分配知識(shí)點(diǎn)及實(shí)例

    在本篇文章里小編給大家整理的是關(guān)于c語(yǔ)言動(dòng)態(tài)內(nèi)存分配知識(shí)點(diǎn)及實(shí)例,需要的朋友們可以學(xué)習(xí)下。
    2020-03-03
  • 通過(guò)c語(yǔ)言調(diào)用系統(tǒng)curl動(dòng)態(tài)庫(kù)的示例詳解

    通過(guò)c語(yǔ)言調(diào)用系統(tǒng)curl動(dòng)態(tài)庫(kù)的示例詳解

    這篇文章中我們將通過(guò)一個(gè)簡(jiǎn)單的示例來(lái)講解如何在Ubuntu系統(tǒng)中通過(guò)C語(yǔ)言調(diào)用動(dòng)態(tài)庫(kù)(共享庫(kù))的方法,我們將使用libcurl庫(kù),這是一個(gè)基于客戶端的URL傳輸庫(kù),廣泛用于各種程序和應(yīng)用中以訪問(wèn)網(wǎng)頁(yè)和服務(wù)器數(shù)據(jù),需要的朋友可以參考下
    2024-03-03
  • C++中引用&與取地址&的區(qū)別分析

    C++中引用&與取地址&的區(qū)別分析

    這篇文章主要介紹了C++中引用&與取地址&的區(qū)別,有助于C++初學(xué)者更好的掌握指針的概念及用法,需要的朋友可以參考下
    2014-09-09
  • c++中new和delete操作符用法

    c++中new和delete操作符用法

    c++中new和delete運(yùn)算符是用于動(dòng)態(tài)分配和撤銷(xiāo)內(nèi)存的運(yùn)算符,下面是示例,大家參考使用吧
    2014-04-04
  • C語(yǔ)言位圖算法詳解

    C語(yǔ)言位圖算法詳解

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)的位圖算法,主要包括了位圖算法的定義與應(yīng)用,對(duì)于C程序算法設(shè)計(jì)的學(xué)習(xí)有一定的借鑒價(jià)值,需要的朋友可以參考下
    2014-09-09
  • C++文件讀取的4種情況匯總

    C++文件讀取的4種情況匯總

    前幾天要用到C++讀取文本文件,就學(xué)習(xí)了一下幾種不同的讀取方法,下面這篇文章主要給大家介紹了關(guān)于C++文件讀取的4種情況,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01

最新評(píng)論