Как правильно получить серийный номер аккумулятора?

В Delphi 7 я работаю над библиотекой, реализующей объект, инкапсулирующий информацию о батареях, подключенных к системе. Он работает хорошо, за исключением получения серийного номера аккумулятора.

Код, который я использую для этого вызова, выглядит следующим образом:

function TBattery.GetSerialNumber(hbat: THandle): boolean;
var
  bqi:          TBatteryQueryInformation;
  Serial:       PWideChar;
  SerialSize,
  dwOut:        DWORD;
begin
  Result := False;

  if hbat <> INVALID_HANDLE_VALUE then
  begin
    ZeroMemory(@bqi, SizeOf(bqi));
    dwOut := 0;

    bqi.BatteryTag := FBatteryTag;
    bqi.InformationLevel := BatterySerialNumber;

    SerialSize := 2048;
    GetMem(Serial, SerialSize);
    try
      ZeroMemory(Serial, SerialSize);

      Result := DeviceIoControl(hbat, IOCTL_BATTERY_QUERY_INFORMATION, @bqi,
                                SizeOf(bqi), Serial, SerialSize, @dwOut, nil);

      if Result then
        FSerialNumber := Serial;
    finally
      FreeMem(Serial, SerialSize);
    end;
  end;
end;

К сожалению, DeviceIoControl()всегда возвращает False, и если я проверю GetLastError()после этого он возвращается с ошибкой 87, «неверный параметр».

Это не имеет особого смысла, потому что код работает отлично, если я просто изменю, скажем, InformationLevelс BatterySerialNumberна BatteryUniqueID. Кроме того, я использовал дескриптор батареи ( hbat) в других вызовах в коде до GetSerialNumber, и все они работают нормально, и я могу звонить другим после сбоя этого как ну так дело не в этом.

Есть идеи? Я действительно в растерянности.

7
задан Restless 30 May 2012 в 23:37
поделиться