Home | Kontakt | Sitemap

Start

Über mich

Kontakt

Sitemap

Lizenz

Anleitungen

DVD, miniDVD

SVCD

Audio, Audio-CD (CD-DA)

AVI

Software

Von Freunden und Bekannten

Eigene Programme

Programmierung

Delphi

Lazarus

Delphi/Lazarus

Projekte

MPEG-1/2 Video

Optische Laufwerke

Audio-CD (CDDA)

Raspberry Pi Dashcam

Verschiedenes

MPEG 2 Schnitt

Project X

VCD Easy

Hardlinks

Windows

Links

Software

Programmierung Delphi - Batterie - Tag der Batterie

Tag der Batterie

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)

Handle > Tag > Informationen