Abfrage der 'System_up_time'



  • Hallo Jochen,

    ich glaube Du hast mich falsch verstanden.

    Die System Up Time hole ich so:

    PDH_STATUS res;
    res = GetPerformanceCounterValue (_T("\\System\\System Up Time"), 
                                      PDH_FMT_LARGE | PDH_FMT_NOSCALE,
                                      &type,
                                      value);
    

    Das geht aber nur auf einem Englischen Windows auf einem Deutschen Windows funktioniert das definitiv nicht.

    Auf einem Deutschen Windows müsste ich diese Zeit so holen:

    PDH_STATUS res;
    res = GetPerformanceCounterValue (_T("\\System\\Systembetriebszeit"), 
                                      PDH_FMT_LARGE | PDH_FMT_NOSCALE,
                                      &type,
                                      value);
    

    Wenn ich jetzt irgendwie rausbekommen könnte welche Sprache das OS hat, könnte ich je nach Sprache die eine oder andere Funktion aufrufen.

    Herzliche Grüsse
    Walter



  • Ja, mir geht es darum, dass es einen anderen Weg gibt, welcher nicht auf Strings basiert...



  • das habe ich noch vergessen, ich habe da eine Klasse (ich glaube von CodeProject)

    PDH_STATUS PerformanceMonitor::GetPerformanceCounterValue (const Tstring& counterName,
                                                                DWORD format,
                                                                LPDWORD type,
                                                                PDH_FMT_COUNTERVALUE& value)
    {
      PDH_STATUS res     = ERROR_SUCCESS;
      HQUERY     query   = NULL;
      HCOUNTER   counter = NULL;
    
      res = PdhOpenQuery (NULL, NULL, &query);
    
      if (res == ERROR_SUCCESS)
        res = PdhAddCounter (query, counterName.c_str (), 0, &counter);
    
      if (res == ERROR_SUCCESS)
        res = PdhCollectQueryData (query);
    
      if (res == ERROR_SUCCESS)
        res = PdhGetFormattedCounterValue (counter, format, type, &value);
    
      if (query)
        PdhCloseQuery (query);
    
      return res;
    }
    

    Herzliche Grüsse
    Walter



  • Hallo Jochen,

    ich habe Deinen Vorschlag mit "Win32_OperatingSystem mit LastBoootUpTime" angeschaut und das Beispiel aus der MSDN in der Console mal angeschaut.

    2 Seiten Code für die Systemstartzeit, na ja.

    Aber wenn's sein muss 🙄

    hr = pclsObj->Get(L"LastBootUpTime", 0, &vtProp, 0, 0);
    

    Das Problem ist nur wie interpretiere ich den Wert in vtProp, scheint eine Kombination aus String und Double zu sein.

    Gibt es eine da eine Funktion welche den Wert irgendwie lesbar macht?

    Herzliche Grüsse
    Walter


  • Mod

    Das ist doch ein Variant... (lieder ist der Code aus dem Context gerissen).
    Du musst Dir den Typ ansehen, der geliefert wird!
    Ansonsten VariantChangeType



  • Hallo Martin,

    das Resultat ist ein BSTR mit folgendem Inhalt:
    "20120424100736.741783+120"

    scheint 2012.04.24 zu sein, aber mit dem 100736.741783+120 kann ich nichts anfangen.

    Herzliche Grüsse
    Walter



  • Das Format ist yyyyMMddhhmmss.ffffff+zzz (zzz = UTC offset)

    -YearSpecified
    -MonthSpecified
    -DaySpecified
    -HoursSpecified
    -MinutesSpecified
    -SecondsSpecified
    -MicrosecondsSpecified
    -UTCSpecified

    http://msdn.microsoft.com/en-us/library/aa393691%28VS.85%29.aspx


  • Mod

    Ansonsten kannst Du das DATE Feld aus dem Varaiant auch benutzen. Es gibt ja COleDateTime um dieses zu beabeiten und zu formatieren.



  • Hallo Jochen, merano und Martin,

    Besten Dank für die Hilfe, jetzt komme ich wieder alleine zurecht.

    Herzliche Grüsse
    Walter



  • Hallo Martin,

    ganz so simpel wars dann doch nicht mit COleDateTime 😉

    ISWbemDateTime *pDateTime = NULL;
    hres = CoCreateInstance (CLSID_SWbemDateTime, 0, CLSCTX_INPROC_SERVER, 
                             IID_ISWbemDateTime, (LPVOID *) &pDateTime);
    if (FAILED(hres))
    {
      cout << "Failed to create ISWbemDateTime object."
           << " Err code = 0x"
           << hex << hres << endl;
      CoUninitialize();
      return 1;
    }
    
    IWbemClassObject *pclsObj;
    ULONG uReturn = 0;
    
    while (pEnumerator)
    {
      HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
    
      if(0 == uReturn)
        break;
    
      VARIANT vtProp;
      hr = pclsObj->Get(_T("LastBootUpTime"), 0, &vtProp, 0, 0);
      pDateTime->put_Value (vtProp.bstrVal);
      DATE date;
      pDateTime->GetVarDate (FALSE, &date);
      COleDateTime odt (date);
      CString str = odt.Format(_T("%d.%m.%Y @ %H:%M:%S"));
    
      // str = "24.04.2012 @ 15:27:57"
    
      VariantClear(&vtProp);
      pclsObj->Release();
    }
    

    Herzliche Grüsse
    Walter


Anmelden zum Antworten