visuel c ++ - Windows VC ++ Få Maskin Model Navn

Indlæg af Hanne Mølgaard Plasc

Problem



Kan nogen fortælle mig, hvordan man får Modelnavn på Windows Machine.
Jeg er ny til Windows VC ++.


For eksempel har jeg en IBM ThinkCenter M50, der kører på Windows. Her er modelnavnet 'Think Center M50'. Jeg vil gerne hente dette fra systemet ved hjælp af nogle API'er.


Tak på forhånd,
Shashi Kiran G M

Bedste reference


Alternativt kan du bruge registreringsdatabasenøglen:


HKEY\_LOCAL\_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ SYSTEMINFORMATION


også: HKEY\_LOCAL\_MACHINE \ HARDWARE \ BESKRIVELSE \ System \ BIOS (kun Win7 eller senere)


Systemproducenten og SystemProductName-posterne skal gøre det. Sparer ved hjælp af WMI, som jeg forsøger at undgå for enhver pris af ydeevne.

Andre referencer 1


Som Ben foreslår, skal du bruge WMI til dette.


Klassen du søger er Win32\_ComputerSystem, som indeholder en skrivebeskyttet Model ejendom af typen streng, der returnerer det produktnavn, som en producent giver til en computer. [4]


Jeg vil lade skrive C ++-koden for at gøre dette WMI-opkald til en øvelse for læseren. [5]


Vær også opmærksom på Ben 's advarsel: Ikke alle producenter offentliggør disse oplysninger i BIOS. Det er meget sandsynligt, at IBM gør det, så din testcase skal fungere fint, men det er ikke en universel antagelse, at du er berettiget til at gøre . Applikationer bør ikke stole på denne ejendom, der indeholder en bestemt værdi.

Andre referencer 2


Ved hjælp af Microsoft eksempelkode kunne jeg oprette denne metode. [6]


#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 rootcimv2 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 };
}