[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
Prze艣lij komentarz
Dzi臋ki za komentarz!