В 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
, и все они работают нормально, и я могу звонить другим после сбоя этого как ну так дело не в этом.
Есть идеи? Я действительно в растерянности.