Ошибка в JwaWinNT.pas

Если кто-то прочитает это и немного офигеет, не удивляйтесь. Это написано в основном для тех, кто в будущем наберёт в строке поисковика «CallNtPowerInformation STATUS_INVALID_PARAMETER», как это сделал я пару дней назад. Правда, я ничего не нашёл, зато неофитам больше повезёт.

Итак, нужно было прикрутить к Type it Easy блокировку кнопки включения/выключения компьютера. Это актуально для тех, у кого есть ноутбуки и маленькие дети. Бился-бился, даже к хорошим людям за помощью обратился, ничего не помогало. При попытке считать или записать политику электропитания, апишная функция CallNtPowerInformation вместо сексуального STATUS_SUCCESS упорно возвращала богомерзкий STATUS_INVALID_PARAMETER. Причём, если вызывать её при POWER_INFORMATION_LEVEL = SystemPowerPolicyCurrent всё хорошо, как только пытаешься использовать SystemPowerPolicyAc или SystemPowerPolicyDc, без которых политику не обновить, получаешь прямо в лоб «инвалид параметр».

А собака вот где, оказывается, порылась: дело в том, что в Delphi нет целой кучи объявлений типов, структур и констант, которые присутствуют в winnt.h. Поэтому народ обычно использует файлы jwawinnt.pas, jwawintype.pas и jediapilib.inc из JEDI Project. А там структура _SYSTEM_POWER_POLICY, нужная для считывания или записи политики, объявлена, как просто record. Чтобы всё заработало, нужно объявить эту структуру, как packed record. Вот такой бубен. Удачи!




Написать комментарий