[CPP|WMI] Pierwszy program

W tym wpisie stworzymy pierwszy prosty program w C++ z u偶yciem biblioteki WMI.

#include <iostream>
#include <comdef.h>
#include <Wbemidl.h>

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

int main() {

    HRESULT hres;

    // Inicjalizacja COM
    hres = CoInitializeEx(0, COINIT_MULTITHREADED);
    
    if(FAILED(hres)) {
    
        std::cout << "Nie mo偶na zainicjalizowa膰 COM!" << std::endl;
        
        return 1;
        
    }

    // Utworzenie sesji WMI
    IWbemLocator* pLoc = 0;
    hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc);
    
    if(FAILED(hres)) {
    
        std::cout << "Nie mo偶na utworzy膰 sesji WMI!" << std::endl;
        
        CoUninitialize();
        
        return 1;
        
    }

    // Po艂膮czenie z lokalnym przestrzeni膮 nazw WMI
    IWbemServices* pSvc = 0;
    hres = pLoc->ConnectServer(_bstr_t(L"ROOT\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc);
    
    if(FAILED(hres)) {
    
        std::cout << "Nie mo偶na po艂膮czy膰 si臋 z przestrzeni膮 nazw WMI!" << std::endl;
        
        pLoc->Release();
        CoUninitialize();
        
        return 1;
        
    }

    // Ustawienie zabezpiecze艅 dla sesji WMI
    hres = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
    
    if(FAILED(hres)) {
    
        std::cout << "Nie mo偶na ustawi膰 zabezpiecze艅 dla sesji WMI" << std::endl;
        
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        
        return 1;
        
    }

    // Wykonanie zapytania WMI
    IEnumWbemClassObject* pEnumerator = 0;
    hres = pSvc->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM Win32_ComputerSystem"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
    
    if(FAILED(hres)) {
    
        std::cout << "Nie mo偶na wykona膰 zapytania WMI" << std::endl;
        
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        
        return 1;
        
    }

    // Pobranie wynik贸w zapytania WMI
    IWbemClassObject* pclsObj = 0;
    ULONG uReturn = 0;
    
    while(pEnumerator) {
    
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
        
        if(0 == uReturn) {
        
            break;
            
        }

        VARIANT vtProp;
        hr = pclsObj->Get(L"TotalPhysicalMemory", 0, &vtProp, 0, 0);
        
        std::cout << "Zainstalowana pami臋膰 RAM: " << vtProp.llVal / 1024 / 1024 << " MB" << std::endl;
        
        VariantClear(&vtProp);

        pclsObj->Release();
        
    }

    // Zwolnienie zasob贸w
    pSvc->Release();
    pLoc->Release();
    pEnumerator->Release();
    CoUninitialize();

    return 0;
    
}

Jak wida膰 na powy偶szym przyk艂adzie, pobieraj膮cy i wy艣wietlaj膮cy informacj臋 TYLKO o rozmiarze pami臋ci RAM program jest do艣膰 obszerny pod wzgl臋dem kodu. Mo偶na sobie wyobrazi膰 ile linii kodu trzeba by艂oby napisa膰 w celu pobrania wi臋cej informacji o systemie lub sprz臋cie. Aby to upro艣ci膰 i zaoszcz臋dzi膰 sobie powtarzania tego samego fragmentu kodu, mo偶na stworzy膰 nak艂adk臋 z funkcj膮 tworz膮c膮 zapytanie WMI. Mo偶na w tym celu wykorzysta膰 szablon. Rozwi膮zanie takie pozwoli trzyma膰 ca艂y kod do obs艂ugi po艂膮czenia i zapytania WMI w jednym pliku.

Komentarze

Popular

[C++] Jak obliczy膰 pole i obw贸d trapezu?

[HTML] Jak wy艣rodkowa膰 tekst?

[PHP|HTML] Od艣wie偶enie strony