# Batteriestatus auslesen



## cwriter (18. Juli 2010)

Hallo

Gibt es eine Möglichkeit, den Batteriestatus eines Notebooks auszulesen und auszugeben?

Vielen Dank

cwriter


----------



## ComFreek (18. Juli 2010)

Mhhm, in C/C++ auf keinen Fall. Wenn schon, muss das in der API des Betriebssystems sein. Für die WinAPI, einfach mal bei Google suchen: Click!


----------



## Matthias Reitinger (18. Juli 2010)

Unter einem aktuellen Linux-System kann man dazu einfach die Dateien aus /sys/class/power_supply/BAT0 auslesen (falls vorhanden).

Grüße,
Matthias


----------



## cwriter (18. Juli 2010)

Oh, Entschuldigung:

Ich benutze Windows 7. Gibt e da auch so ein Verzeichnis wie unter Linux?

Danke

cwriter


----------



## saftmeister (18. Juli 2010)

IMHO gibts bei Windows kein Verzeichnis, das ähnlich wie /proc das Fenster zum Kernel anbietet. Aber man könnte es doch mal mit WMI versuchen: http://www.experts-exchange.com/Programming/Languages/Scripting/WMI/Q_25856179.html

Ist zwar Windows XP aber WMI gibts unter Win7 auch...

In der MSDN wird das ganze auch noch sehr detailiert erklärt: http://msdn.microsoft.com/en-us/library/aa394074(VS.85).aspx


----------



## Matthias Reitinger (18. Juli 2010)

cwriter hat gesagt.:


> Ich benutze Windows 7. Gibt e da auch so ein Verzeichnis wie unter Linux?


Nein, so unkompliziert geht das leider nur mit Linux ;-) Eine Übersicht zum Abfragen von Batterieinformationen unter Windows findest du in der MSDN-Bibliothek.

Grüße,
Matthias


----------



## Cromon (18. Juli 2010)

Nein, (meiner Meinung nach) noch viel einfacher:
GetSystemPowerStatus


----------



## cwriter (23. Juli 2010)

Vielen Dank für die Antworten!

@Cromon: Gibt es einen Beispielcode dazu?

Danke

cwriter


----------



## Cromon (23. Juli 2010)

Was ist denn nicht klar? Du musst der Funktion einfach die entsprechende Struktur übergeben und sie dann auslesen, steht alles in der MSDN.


----------



## cwriter (24. Juli 2010)

Wenn ich die Funktion in mein Programm kopiere, gibt es nur Fehlermeldungen (out__ is not defined). Was mache ich falsch?

Danke

cwriter


----------



## Cromon (24. Juli 2010)

Also das ist eine Funktion aus dem Windows SDK. Du musst, wie es in der MSDN steht die Windows.h includieren und dann die Funktion einfach normal aufrufen.


----------



## saftmeister (24. Juli 2010)

Erstmal solltest du lernen, die Dokumentation richtig zu lesen. __out bedeutet in dem Fall, das du einen Puffer übergibst, der in der Funktion mit Inhalt gefüllt wird. Dein Aufruf müsste ungefähr so aussehen:


```
#include <windows.h>
#include <stdio.h>

int main(void)
{
  LPSYSTEM_POWER_STATUS lpSystemPowerStatus;
  if( GetSystemPowerStatus( lpSystemPowerStatus ) )
  {
    printf("Battery time left in percent: %d%%\n", lpSystemPowerStatus->BatteryLifePercent);
  }
  else
  {
    printf("Getting Battery Status failed with error code %d", GetLastError());
    return -1;
  }

  return 0;
}
```

** Ungetestet. **


----------



## Cromon (24. Juli 2010)

Einen unitialisierten Zeiger zu verwenden ist nicht so schön 

```
#include <windows.h>
#include <stdio.h>
 
int main(void)
{
  SYSTEM_POWER_STATUS SystemPowerStatus;
  if( GetSystemPowerStatus( &SystemPowerStatus ) )
  {
    printf("Battery time left in percent: %d%%\n", SystemPowerStatus.BatteryLifePercent);
  }
  else
  {
    printf("Getting Battery Status failed with error code %d", GetLastError());
    return -1;
  }
 
  return 0;
}
```


----------



## saftmeister (24. Juli 2010)

Da hast du wohl recht. Es war mir nicht klar, das Windows den Zeiger nicht selbst mit Speicher füllt, aber es ging hier auch nur ums Prinzip. Wo bleibt für ihn die Heraussforderung, wenn man alles haarklein liefert? ;-)


----------



## Cromon (24. Juli 2010)

Wie soll Windows da was füllen, wenn der Zeiger auf irgendeine undefinierte Stelle zeigt?


----------



## saftmeister (24. Juli 2010)

Es soll Funktionen geben, die den Speicher selbst allokieren. Dieser Speicher muss dann vom Programm freigegeben werden. Ich habe zwar grad kein Beispiel zur Hand aber es gibt sie.

Edit: strdup() ist ein Beispiel. Ist zwar nicht Windows-spezifisch aber es zeigt, worauf ich hinaus will.

BTW: Das ist OT.


----------



## Cromon (24. Juli 2010)

Ja klar, aber wie weiss dann der User ausserhalb, wo der Speicher alloziert wurde? strdup gibt den Zeiger zurück, andere Funktionen erwarten einen Zeiger auf den Zeiger, den sie füllen sollen, aber GetSystemPowerStatus erwartet weder einen Zeiger auf einen Zeiger in dem die allozierte Adresse gespeichert werden soll noch wird diese Adresse zurückgegeben


----------



## saftmeister (25. Juli 2010)

Alles klar, ich hab bereits geschrieben, das du Recht hast... Und ein Zeiger ist ein Zeiger ist ein Zeiger... Was die Funktion mit dem Zeiger macht, siehst du der Funktion durch den Prototypen erst einmal nicht an. Das steht wenn dann ohnehin in der Dokumentation (hoffentlich). Da es hier nicht drin steht, kann man davon ausgehen, das die Funktion einen Zeiger auf bereits allokierten Speicher erwartet. Nachdem wir konsequent Off-Topic geblieben sind, haben wir den Ursprungsposter hoffentlich total verwirrt ;-)


----------



## Cromon (25. Juli 2010)

Um noch ein letztes mal Offtopic zu sein 

Du gibst der Funktion einen Zeiger mit einer x-beliebigen (O.B.d.A ungültigen) Adresse. Angenommen in der Funktion wird jetzt Speicher alloziert, dann bekommt der eine andere Adresse. Wie willst du die Funktion das jetzt speichern? Das Funktionsargument ist ja nur eine Kopie des Zeigers, den du ihr übergeben hast. Dieser Kopie die Adresse zuzweisen hat keinen Einfluss auf den Zeiger ausserhalb der Funktion. Zurückgegeben wird auch nichts dergleichen, daher hat diese Funktion gar nicht die Möglichkeit dir mitzuteilen, wo der allozierte Speicher liegt, dazu wäre eben ein Zeiger auf einen Zeiger nötig.


----------



## saftmeister (25. Juli 2010)

Da muss ich dir Recht geben.


----------

