c 获取计算机型号,如何从Windows注册表中的计算机制造商和型号的C ++?(How to get computer...

随着的帮助微软的示例代码 ,我能创造这个方法。

#include

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

std::pair getComputerManufacturerAndModel() {

// Obtain the initial locator to Windows Management on a particular host computer.

IWbemLocator *locator = nullptr;

IWbemServices *services = nullptr;

auto hResult = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&locator);

auto hasFailed = [&hResult]() {

if (FAILED(hResult)) {

auto error = _com_error(hResult);

TRACE(error.ErrorMessage());

TRACE(error.Description().Detach());

return true;

}

return false;

};

auto getValue = [&hResult, &hasFailed](IWbemClassObject *classObject, LPCWSTR property) {

CString propertyValueText = "Not set";

VARIANT propertyValue;

hResult = classObject->Get(property, 0, &propertyValue, 0, 0);

if (!hasFailed()) {

if ((propertyValue.vt == VT_NULL) || (propertyValue.vt == VT_EMPTY)) {

} else if (propertyValue.vt & VT_ARRAY) {

propertyValueText = "Unknown"; //Array types not supported

} else {

propertyValueText = propertyValue.bstrVal;

}

}

VariantClear(&propertyValue);

return propertyValueText;

};

CString manufacturer = "Not set";

CString model = "Not set";

if (!hasFailed()) {

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

hResult = locator->ConnectServer(L"ROOT\\CIMV2", nullptr, nullptr, 0, NULL, 0, 0, &services);

if (!hasFailed()) {

// Set the IWbemServices proxy so that impersonation of the user (client) occurs.

hResult = CoSetProxyBlanket(services, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, nullptr, RPC_C_AUTHN_LEVEL_CALL,

RPC_C_IMP_LEVEL_IMPERSONATE, nullptr, EOAC_NONE);

if (!hasFailed()) {

IEnumWbemClassObject* classObjectEnumerator = nullptr;

hResult = services->ExecQuery(L"WQL", L"SELECT * FROM Win32_ComputerSystem", WBEM_FLAG_FORWARD_ONLY |

WBEM_FLAG_RETURN_IMMEDIATELY, nullptr, &classObjectEnumerator);

if (!hasFailed()) {

IWbemClassObject *classObject;

ULONG uReturn = 0;

hResult = classObjectEnumerator->Next(WBEM_INFINITE, 1, &classObject, &uReturn);

if (uReturn != 0) {

manufacturer = getValue(classObject, (LPCWSTR)L"Manufacturer");

model = getValue(classObject, (LPCWSTR)L"Model");

}

classObject->Release();

}

classObjectEnumerator->Release();

}

}

}

if (locator) {

locator->Release();

}

if (services) {

services->Release();

}

CoUninitialize();

return { manufacturer, model };

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值