VS 2010 C++ MFC Problem z WMI Win32_TemperatureProbe

Odpowiedz Nowy wątek
2011-10-01 18:44
0

Witam,
W sieci znalazłem kod programu, który za pomocą WMI wyświetla nazwę procesora.
Wszystko jest OK gdy przy tworzeniu zapytania do WMI używam Win32_Processor.

        HRESULT hRes;
    BSTR strQuery = (L"Select * from Win32_Processor"); 
    BSTR strQL = (L"WQL"); 
    hRes = pWbemServices->ExecQuery(strQL, strQuery,WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumObject); 

Problem pojawia się gdy chcę przerobić ten kod programu, tak aby wyświetlał jakąś inną informację o komputerze, np. temperaturę procesora. Używam wtedy Win32_TemperatureProbe (zamiast Win32_Processor), a program się wysypuje podczas odczytu temperatury.

Kod programu poniżej:

void CCPU_TemperatureDlg::OnBnClickedButton1()
{
    // TODO: Add your control notification handler code here
    // TODO: Add your control notification handler code here
    CoInitialize(NULL);  //Inicjalizacja bibliotek COM

    //Security needs to be initialized in XP first and this was the major problem 
    //why it was not working in XP.

    if(CoInitializeSecurity( NULL,          
    -1,                                     
    NULL,
    NULL,
    RPC_C_AUTHN_LEVEL_PKT,
    RPC_C_IMP_LEVEL_IMPERSONATE,
    NULL,
    EOAC_NONE,
    0
    ) != S_OK)
        //return;

    IWbemLocator * pIWbemLocator = NULL;   
    IWbemLocator * pIWbemLocator = NULL; 
    IWbemServices * pWbemServices = NULL;   
    IEnumWbemClassObject * pEnumObject  = NULL;

    BSTR bstrNamespace = (L"root\\cimv2");

    if(CoCreateInstance (                                   
            CLSID_WbemAdministrativeLocator,                
            NULL ,
            CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER , 
            IID_IUnknown ,
            ( void ** ) & pIWbemLocator         
            ) != S_OK)
                return;

    if(pIWbemLocator->ConnectServer(                    
                bstrNamespace,  // Namespace            
                NULL,          // Userid
                NULL,           // PW
                NULL,           // Locale
                0,              // flags
                NULL,           // Authority
                NULL,           // Context
                &pWbemServices                          
                ) != S_OK)
                return;

    HRESULT hRes;
    //BSTR strQuery = (L"Select * from MSAcpi_ThermalZoneTemperature");
    BSTR strQuery = (L"Select * from Win32_TemperatureProbe"); 
    BSTR strQL = (L"WQL");  
    hRes = pWbemServices->ExecQuery(strQL, strQuery,WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumObject);  

    if(hRes != S_OK)
    {
        MessageBox("Could not execute Query");
        return;
    }

    ULONG uCount = 1, uReturned;
    IWbemClassObject * pClassObject = NULL;

    hRes = pEnumObject->Reset(); 

    if(hRes != S_OK)
    {
        MessageBox("Could not Enumerate1");
        return;
    }

    hRes = pEnumObject->Next(WBEM_INFINITE,uCount, &pClassObject, &uReturned);
    if(hRes != S_OK)
    {
        MessageBox("Could not Enumerate2");
        return;
    }

    VARIANT v;
    //BSTR strClassProp = SysAllocString(L"LoadPercentage");
    BSTR strClassProp = SysAllocString(L"CurrentReading");               
    hRes = pClassObject->Get(strClassProp, 0, &v, 0, 0);
    if(hRes != S_OK)
    {
        MessageBox("Could not Get Value");
        return;
    }

    SysFreeString(strClassProp);

    _bstr_t bstrPath = &v;  //Just to convert BSTR to ANSI
    char* strPath=(char*)bstrPath;

    if (SUCCEEDED(hRes))
        MessageBox(strPath);
    else
        MessageBox("Error in getting object");

    VariantClear( &v );
    pIWbemLocator->Release();
    pWbemServices->Release();
    pEnumObject->Release();
    pClassObject->Release();
    CoUninitialize();

}

Proszę o pomoc w rozwiązaniu problemu.

POZDRAWIAM

CurrentReading jest typu sint32, być może to jest problem?
Jeśli tak, to jak zmienić poniższy kod, aby wartość ta wyświetliła się w MessageBox?


VARIANT v;
        //BSTR strClassProp = SysAllocString(L"LoadPercentage");
        BSTR strClassProp = SysAllocString(L"CurrentReading");               
        hRes = pClassObject->Get(strClassProp, 0, &v, 0, 0);
        if(hRes != S_OK)
        {
                MessageBox("Could not Get Value");
                return;
        }

        SysFreeString(strClassProp);

        _bstr_t bstrPath = &v;  //Just to convert BSTR to ANSI
        char* strPath=(char*)bstrPath;

        if (SUCCEEDED(hRes))
                MessageBox(strPath);
        else
                MessageBox("Error in getting object");
edytowany 1x, ostatnio: kamito, 2011-10-01 18:46

Pozostało 580 znaków

2011-10-01 19:57
0

Podsumowując:
1) Znalazłeś kod, którego nie rozumiesz, na dodatek nie używasz odpowiedniego formatowania.
2) Nie potrafisz korzystać z debugger'a, aby znaleźć informację kiedy program się wysypuje.
3) Szukasz jelenia, który kod przeanalizuje kod i jak na oko będzie ok to wrzuci to do VS i zrobi robotę za Ciebie.
Ehh..

Kiedy ten wyjątek leci dokładnie?


Pozdro & poćwicz!

Pozostało 580 znaków

2011-10-01 23:18
Kamito
0

CurrentReading jest typu sint32. Po odczytaniu wartość ta przechowywana jest w zmiennej typu Variant, nazwa tej zmiennej w kodzie powyżej to v.
Jak prze-konwertować tą zmienną na np. CString, który będę mógł wyświetlić w MessageBox.
Rozwiązania szukałem w Googlach ale niestety nie znalazłem....

Proszę o pomoc

Pozostało 580 znaków

2011-10-01 23:25
Rev
0

Zwykłe rzutowanie wystarczy. Oczywiście możesz rzutować tylko na taki typ, którego jest VARIANT. Nie możesz od razu na string, tylko do int. Potem chyba wiesz co dalej.


Pozostało 580 znaków

2011-10-02 07:08
Kamito
0

Witam,
Poniżej sposób w jaki zamieniam zmienną sint na cstring. Coś jest dalej nie tak, bo odczyty temperatury wyświetlane w MwssageBox wychodzą bardzo dziwne np. 5631968, 4648144, 6681000.....


VARIANT v;
    //BSTR strClassProp = SysAllocString(L"LoadPercentage");
    BSTR strClassProp = SysAllocString(L"CurrentReading");                 
    hRes = pClassObject->Get(strClassProp, 0, &v, 0, 0);
    if(hRes != S_OK)
    {
        MessageBox("Could not Get Value");
        return;
    }

    SysFreeString(strClassProp);

    int c = (int)&v;
    //_bstr_t bstrPath = &v;  //Just to convert BSTR to ANSI
    //char* strPath=(char*)bstrPath;
    char* strPath;
    CString a;
    a.Format("%d", c);

    if (SUCCEEDED(hRes))
        MessageBox(a);

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0