Windows VC ++ Получить имя модели машины - PullRequest
2 голосов
/ 09 марта 2012

Может кто-нибудь Подскажите, пожалуйста, как узнать название модели Windows Machine. Я новичок в Windows VC ++.

Например, у меня есть IBM ThinkCenter M50, работающий в Windows. Здесь модель называется «Think Center M50». Я хочу получить это из Системы, используя некоторый API.

Заранее спасибо, Шаши Киран Г М

Ответы [ 3 ]

5 голосов
/ 21 ноября 2013

В качестве альтернативы, вы можете использовать раздел реестра:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ * Информация о системе 1003 *

также: HKEY_LOCAL_MACHINE \ HARDWARE \ DESCRIPTION \ System \ BIOS (только для Win7 или новее)

Записи SystemManufacturer и SystemProductName должны это делать. Сохраняет с помощью WMI, чего я стараюсь избежать любой ценой из соображений производительности.

1 голос
/ 09 марта 2012

Как предполагает Бен, для этого вам нужно использовать WMI.

Класс, который вы ищете, это Win32_ComputerSystem, который содержит только для чтения Model свойство типа string, которое возвращает имя продукта, которое производитель дает компьютеру.

Я оставлю написание кода C ++, чтобы сделать этот вызов WMI в качестве упражнения для читателя .

Обратите внимание также на предостережение Бена: не все производители публикуют эту информацию в BIOS.Весьма вероятно, что IBM это делает, поэтому ваш тестовый сценарий должен работать нормально, но это не универсальное предположение, которое вы оправдываете.Приложения не должны полагаться на это свойство, содержащее определенное значение.

0 голосов
/ 31 января 2017

С помощью примера кода 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 };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...