Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Вопрос по использованию WMI-классов.


Автор: AndreySol 11.4.2005, 06:33
ОС - WinMe.
Компилятор - MSVC++ 6.0 + SP5.
Подскажите, кто знает, можно ли добраться с помощью WMI до такой информации BIOS как температура процессора и обороты кулера процессора.
Если можно - то желательно с примером кода.

Автор: jorkug 12.4.2005, 14:34
http://www.sources.ru/cpp/cpp_system.shtml#7

Автор: IEZ 14.4.2005, 10:18
В самое начало stdafx.h засунь #define _WIN32_DCOM
и должно быть _WIN32_WINNT >= 0x0400



Код

#pragma comment (lib, "Wbemuuid")
#include "COMDEF.H"
#include "Wbemidl.h"

void CHiDlg::OnBnClickedOk()
{

        CoInitialize (NULL);

        CoInitializeSecurity(NULL, -1, NULL, NULL,
                RPC_C_AUTHN_LEVEL_CONNECT,
                RPC_C_IMP_LEVEL_IMPERSONATE,
                NULL, EOAC_NONE, 0);

        HRESULT hr = 0;
        IWbemLocator *pWbemLocator = NULL;

        if(SUCCEEDED(hr = CoCreateInstance (CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (void**) &pWbemLocator)))
        {       
                IWbemServices *pServices = NULL;
                if(SUCCEEDED(hr = pWbemLocator->ConnectServer(_bstr_t(L"root\\cimv2"), NULL, NULL, NULL, 0, 
                        NULL, NULL, &pServices)))
                {
                        IEnumWbemClassObject * pEnum = NULL;
                        hr = pServices->CreateInstanceEnum(_bstr_t(L"Win32_BIOS"), 0, NULL, &pEnum);
                        if(pEnum)
                        {
                                ULONG uReturned = 1;
                                while(uReturned == 1)
                                {
                                        IWbemClassObject * pClassObject = NULL;

                                        hr = pEnum->Next(7000, 1, &pClassObject, &uReturned);

                                        if (SUCCEEDED(hr) && (uReturned == 1))
                                        {
                                                VARIANT v;
                                                VariantInit(&v);                                        
                                                CIMTYPE vtType = 0;
                                                LONG lFlavor = 0L;

                                                pClassObject->Get (L"Description", 0, &v, &vtType, &lFlavor);
                                                if(v.vt == VT_BSTR)
                                                {
                                                        WCHAR buf[1024] = L"";
                                                        DWORD dwLen = *((DWORD*)v.bstrVal - 1)/sizeof(WCHAR);
                                                        wcsncpy(buf, v.bstrVal, dwLen); 
                                                        *(buf + dwLen) = L'\0';

                                                        ::MessageBoxW (0, buf, L"", MB_OK);
                                                }

                                                VariantClear(&v);

                                                pClassObject->Release ();

                                        }
                                }//end while
                                pEnum->Release ();
                        }
                        pServices->Release ();
                }

                pWbemLocator->Release ();
        }

        CoUninitialize ();
}


Вместо "Win32_BIOS" можешь подставлять имена других WMI-классов

P.S. Код сделан на VC++

Автор: AndreySol 18.4.2005, 06:47
Вы проще скажите - да или нет, а то у меня SDK пока нет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)