C++獲取硬件參數(shù)的示例詳解
分別顯示
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ù)的之字形層序遍歷),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C語(yǔ)言實(shí)現(xiàn)散列表(哈希Hash表)實(shí)例詳解
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)散列表(哈希Hash表)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06c語(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ò)一個(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