Programmierung > Delphi > Batterie > Tag

Tag der Batterie

  • Beschreibung
  • Control Code IOCTL_BATTERY_QUERY_TAG
  • Download
  • Links
  • Beschreibung

    Weil Batterien in der Regel gewechselt und in unterschiedliche Steckplätze eingesetzt werden können, wird jeder Batterie ein Tag zugeordnet. Dieses Tag muss für alle Abfragen verwendet werden. Stimmt das Tag nicht, schlägt die Abfrage fehl.

    Der Tag dürfte einem Handle entsprechen.

    Bei meinem Laptop kann man die Batterie wechseln. Es hat allerdings nur einen Steckplatz dafür.

    Control Code IOCTL_BATTERY_QUERY_TAG

    Die c++-Definition im NSDN Windows Dev Center:

    BOOL DeviceIoControl(
      (HANDLE) hDevice,            // handle to battery
      IOCTL_BATTERY_QUERY_TAG,     // dwIoControlCode
      (LPVOID) lpInBuffer,         // input buffer
      (DWORD) nInBufferSize,       // size of input buffer
      (LPVOID) lpOutBuffer,        // output buffer
      (DWORD) nOutBufferSize,      // size of output buffer
      (LPDWORD) lpBytesReturned,   // number of bytes returned
      (LPOVERLAPPED) lpOverlapped  // OVERLAPPED structure
    );
    

    hDevice: Das Handle, welches im Kapitel Handle ermittelt wurde.

    dwIoControlCode: Der Controlcode für die Operation.

    lpInBuffer: Ein Zeiger auf einen Wert, der in Millisekunden angibt, wie lange auf eine Antwort gewartet werden soll. -1 gibt an, dass unendlich lange gewartet oder bis zum Abbruch gewartet werden soll.

    nInBufferSize: Die Größe der Datenstruktur in Byte.

    lpOutBuffer: Der Zeiger auf den Rückgabepuffer, welcher den gegenwärtigen Tag der Batterie enthält. Der Tag ist vom Typ ULONG.

    nOutBufferSize: Die Größe des Rückgabepuffers.

    lpBytesReturned: Ein Zeiger auf einen Wert, der in Byte angibt, wieviel Daten zurückgegben wurden.

    lpOverlapped: Ein Zeiger auf die Overlapped Struktur. Sie kann nur vorhanden sein, wenn das Gerät mit dem Flag FILE_FLAG_OVERLAPPED geöffnet wurde. Dies ist hier nicht der Fall.

    Wurde die Operation fehlerfrei durchgeführt ist der Rückgabewert 0.

    Die Funktion ist in Delphi in der Unit Windows deklariert.

    Der Controlcode IOCTL_BATTERY_QUERY_INFORMATION ist in der batclass.h definiert:

    #define FILE_DEVICE_BATTERY   0x00000029
     
    #define IOCTL_BATTERY_QUERY_TAG \
        CTL_CODE(FILE_DEVICE_BATTERY,0x10,METHOD_BUFFERED,FILE_READ_ACCESS)
    

    Die Deklaration der Funktion in Delphi:

    const
      FILE_DEVICE_BATTERY = $00000029;
      FILE_READ_ACCESS    = $0001;
      METHOD_BUFFERED     = $0000;
    
    const
      IOCTL_BATTERY_QUERY_TAG = (FILE_DEVICE_BATTERY shl 16 or
                                 FILE_READ_ACCESS shl 14 or
                                 $10 shl 2 or
                                 METHOD_BUFFERED);
    

    Die Funktion in Delphi 7

    function GetBatteryTag(hBattery: THandle): ULONG;
    var
      dwWait     : Cardinal;
      dwTag      : Cardinal;
      dwReturned : Cardinal;
    begin
      Result := DWORD(-1);
      dwWait :=  0;
    
      if (DeviceIoControl(hBattery,
                          IOCTL_BATTERY_QUERY_TAG,
                          @dwWait,
                          SizeOf(dwWait),
                          @dwTag,
                          SizeOf(dwTag),
                          dwReturned,
                          nil))
      then begin
        Result := dwTag;
      end;
    end;
    

    Download

    Demo mit Delphi 7 compiliert
    battery_tag_exe.7z (152 kB) - MD5 (1kB)

    Source der Demo
    battery_tag_src.7z (3 kB) - MD5 (1kB)