Windows VC ++获取机器型号名称

任何人都可以请告诉我如何获得Windows机型的名称。 我是Windows VC ++的新手。

例如,我有一台在Windows上运行的IBM ThinkCenter M50。 这里的型号名称是“Think Center M50”。 我想使用一些API从系统中获得这个。

在此先感谢Shashi Kiran GM

或者,您可以使用注册表项:

HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \控制\ SystemInformation

还有:HKEY_LOCAL_MACHINE \ HARDWARE \ DESCRIPTION \ System \ BIOS(仅适用于Win7或更高版本)

SystemManufacturer和SystemProductName条目应该这样做。 保存使用WMI,我试图避免不惜一切代价性能的原因。

正如Ben所建议的那样,您需要使用WMI来实现这一点。

您正在寻找的类是Win32_ComputerSystem ,它包含一个只读的Model类型的属性,它返回制造商给计算机的产品名称。

我将留下编写C ++代码,使这个WMI调用作为读者的练习 。

请注意Ben的警告:并非所有制造商都在BIOS中发布此信息。 IBM很有可能这样做,所以你的测试用例应该可以正常工作,但这不是一个普遍的假设,你有理由做出来。 应用程序不应该依赖包含特定值的此属性。

在Microsoft示例代码的帮助下,我能够创建这种方法。

 #include <Wbemidl.h> #pragma comment(lib, "wbemuuid.lib") std::pair<CString,CString> 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 }; }