c++获得cpu厂商_C++ WMI获取系统硬件信息(CPU/DISK/NetWork etc)

本文展示了如何使用C++通过Windows Management Instrumentation (WMI) API获取CPU和系统的硬件信息,如操作系统名称。通过初始化COM,设置安全级别,连接到WMI命名空间并执行查询来实现。
摘要由CSDN通过智能技术生成

#define _WIN32_DCOM#include

using namespacestd;

#include#include

#pragma comment(lib, "wbemuuid.lib")

int main(int argc, char **argv)

{

HRESULT hres;//Step 1: --------------------------------------------------//Initialize COM. ------------------------------------------

hres= CoInitializeEx(0, COINIT_MULTITHREADED);if(FAILED(hres))

{

cout<< "Failed to initialize COM library. Error code = 0x"

<< hex << hres <

}//Step 2: --------------------------------------------------//Set general COM security levels --------------------------

hres=CoInitializeSecurity(

NULL,-1, //COM authentication

NULL, //Authentication services

NULL, //Reserved

RPC_C_AUTHN_LEVEL_DEFAULT, //Default authentication

RPC_C_IMP_LEVEL_IMPERSONATE, //Default Impersonation

NULL, //Authentication info

EOAC_NONE, //Additional capabilities

NULL //Reserved

);if(FAILED(hres))

{

cout<< "Failed to initialize security. Error code = 0x"

<< hex << hres <

CoUninitialize();return 1; //Program has failed.

}//Step 3: ---------------------------------------------------//Obtain the initial locator to WMI -------------------------

IWbemLocator*pLoc =NULL;

hres=CoCreateInstance(

CLSID_WbemLocator,0,

CLSCTX_INPROC_SERVER,

IID_IWbemLocator, (LPVOID*) &pLoc);if(FAILED(hres))

{

cout<< "Failed to create IWbemLocator object."

<< "Err code = 0x"

<< hex << hres <

CoUninitialize();return 1; //Program has failed.

}//Step 4: -----------------------------------------------------//Connect to WMI through the IWbemLocator::ConnectServer method

IWbemServices*pSvc =NULL;//Connect to the root\cimv2 namespace with//the current user and obtain pointer pSvc//to make IWbemServices calls.

hres = pLoc->ConnectServer(

_bstr_t(L"ROOT\\CIMV2"), //Object path of WMI namespace

NULL, //User name. NULL = current user

NULL, //User password. NULL = current

0, //Locale. NULL indicates current

NULL, //Security flags.

0, //Authority (for example, Kerberos)

0, //Context object

&pSvc //pointer to IWbemServices proxy

);if(FAILED(hres))

{

cout<< "Could not connect. Error code = 0x"

<< hex << hres <

pLoc->Release();

CoUninitialize();return 1; //Program has failed.

}

cout<< "Connected to ROOT\\CIMV2 WMI namespace" <

hres=CoSetProxyBlanket(

pSvc,//Indicates the proxy to set

RPC_C_AUTHN_WINNT, //RPC_C_AUTHN_xxx

RPC_C_AUTHZ_NONE, //RPC_C_AUTHZ_xxx

NULL, //Server principal name

RPC_C_AUTHN_LEVEL_CALL, //RPC_C_AUTHN_LEVEL_xxx

RPC_C_IMP_LEVEL_IMPERSONATE, //RPC_C_IMP_LEVEL_xxx

NULL, //client identity

EOAC_NONE //proxy capabilities

);if(FAILED(hres))

{

cout<< "Could not set proxy blanket. Error code = 0x"

<< hex << hres <

pSvc->Release();

pLoc->Release();

CoUninitialize();return 1; //Program has failed.

}//Step 6: --------------------------------------------------//Use the IWbemServices pointer to make requests of WMI ----//For example, get the name of the operating system

IEnumWbemClassObject* pEnumerator =NULL;

hres= pSvc->ExecQuery(

bstr_t("WQL"),

bstr_t("SELECT * FROM Win32_OperatingSystem"),

WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,

NULL,&pEnumerator);if(FAILED(hres))

{

cout<< "Query for operating system name failed."

<< "Error code = 0x"

<< hex << hres <

pSvc->Release();

pLoc->Release();

CoUninitialize();return 1; //Program has failed.

}//Step 7: -------------------------------------------------//Get the data from the query in step 6 -------------------

IWbemClassObject*pclsObj =NULL;

ULONG uReturn= 0;while(pEnumerator)

{

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

{break;

}

VARIANT vtProp;//Get the value of the Name property

hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);

wcout<< "OS Name :" << vtProp.bstrVal <

VariantClear(&vtProp);

pclsObj->Release();

}//Cleanup//========

pSvc->Release();

pLoc->Release();

pEnumerator->Release();

CoUninitialize();return 0; //Program successfully completed.

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值