Batteriestatus auslesen

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.
 
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:

C++:
#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. **
 
Einen unitialisierten Zeiger zu verwenden ist nicht so schön ;)
C:
#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;
}
 
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? ;-)
 
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.
 
Zuletzt bearbeitet:
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 ;)
 
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 ;-)
 
Um noch ein letztes mal Offtopic zu sein :P

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.
 
Zurück