C++獲取硬件參數(shù)的示例詳解
分別顯示
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程序的操作方法,打開遠(yuǎn)程 Linux 服務(wù)器上的文件夾本文以 /root/ 為例,給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12
基于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)代碼
自動(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
C語言代碼實(shí)現(xiàn)通訊錄管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言代碼實(shí)現(xiàn)通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
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 的相關(guān)資料,需要的朋友可以參考下2016-07-07

