Win32_TemperatureProbe



  • Hi,
    ich möchte ein Programm schreiben das die CPU Temperatur ausliest aber leider habe ich von WMI und so keine Ahnung. Hab im Netzt einen Code gefunden der aber leider nicht funktioniert, bei mir wird nichts angezeigt. Hier der Code, vielleicht findet ihr den Fehler:

    int _tmain(int argc, _TCHAR* argv[])
    {
      try 
      { 
         IEnumWbemClassObject * enumerator = 0; 
         IWbemClassObject * object = 0; 
         IWbemServices * services = 0; 
         IWbemLocator * locator = 0; 
         HRESULT result; 
         ULONG returned; 
         BSTR query; 
         BSTR ns; 
    
         CoInitialize( 0 ); 
    
         result = CoCreateInstance( CLSID_WbemAdministrativeLocator, 0, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IID_IUnknown, reinterpret_cast<LPVOID *>(&locator) ); 
         if (FAILED(result)) 
         { 
            std::wcerr << L"Fehler 1" << std::endl; 
            return 2; 
         } 
    
         ns = SysAllocString( L"\\\\.\\root\\cimv2" ); 
         result = locator->ConnectServer( ns, 0, 0, 0, 0, 0, 0, &services ); 
         SysFreeString( ns ); 
         if (FAILED(result)) 
         { 
            std::wcerr << L"Fehler 2" << std::endl; 
            locator->Release(); 
            return 3; 
         } 
    
         std::wcout << L"Verbindung ok" << std::endl; 
    
         query = SysAllocString( L"SELECT * FROM Win32_TemperatureProbe" ); 
    	 std::cout << query << "\n";
         result = services->ExecQuery( L"WQL", query, WBEM_FLAG_RETURN_IMMEDIATELY, 0, &enumerator ); 
         if (FAILED(result)) 
         { 
            std::wcerr << L"Fehler 3" << std::endl; 
            services->Release(); 
            locator->Release(); 
            return 4; 
         } 
    
         enumerator->Reset(); 
         for (result = enumerator->Next( WBEM_INFINITE, 1, &object, &returned ); SUCCEEDED(result); result = enumerator->Next( WBEM_INFINITE, 1, &object, &returned )) 
         { 
            VARIANT variant; 
            BSTR prop = SysAllocString( L"CurrentRead" ); 
            result = object->Get( prop, 0, &variant, NULL, NULL ); 
            SysFreeString(prop); 
            std::wcout << L"Temperature : " << variant.intVal << std::endl; 
            VariantClear( &variant ); 
            object->Release(); 
         } 
    
         enumerator->Release(); 
         services->Release(); 
         locator->Release(); 
    
         CoUninitialize();
    
      } 
      catch (...) 
      { 
         std::wcerr << "FATAL ERROR" << std::endl; 
         return 1; 
      } 
    
    }
    

    Gruß
    _SucheHilfe_



  • Brauchst du da nicht einen Treiber, oder darf man dass aus dem normalen Program heraus lesen? Du musst aber doch wahrscheinlich deinen Chipsatz berücksichtigen, oder ist das Interface Standatisiert? Auch Programme wie Aida32/Everest haben auf manchen Rechnern Probleme die Temperatur zu lesen, bzw. es wird kein Sensor gefunden.



  • Benutzte mal die Forensuche. Da solltest du eigentlcih zwei Threads über den Umgang mit WMI-Klassen finden (Post von -King-). Aber falls dein Prozessor gar keinen Temperatur-Sensor haben sollte, dann könntest du natürlich auch gar nichts auslesen - kannst du denn im Bios die Temperatur auslesen?



  • wenn ich mich nich grad irre, dann basieren diese wmi infos auf der SMBios table und die enthält nur in gaaaanz seltenen fällen temp probes von hardware. schuld daran sind die bios hersteller.

    du musst die temperatur also über einen treiber direkt aus den monitoring chips auslesen.



  • Hi,
    vielen Dank für die Antworten.
    Ja mein Biaos kann die Temperatur auslesen, aber wenn das mit der WMI Klasse nicht geht, dann mach ich das mit MBM5. Da kann ich Plugins schreiben für mein Programm

    MfG
    _SucheHilfe_


Anmelden zum Antworten