Показать сообщение отдельно
  #1  
Старый 08.01.2018, 06:44
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию PowerEnumerate под Win64

Есть такая функция:
Код:
function PowerEnumerate(RootPowerKey : THandle; SchemeGuid : PGUID; SubGroupOfPowerSettingsGuid : PGUID; AccessFlags: POWER_DATA_ACCESSOR; Index: ULONG; var Buffer : TGUID; var BufferSize : DWORD) : DWORD; stdcall; external 'PowrProf.dll';

Вызов:
Код:
procedure TPowerPlansList.GetPowerPlans;
const
  BufferLength : DWORD = 1024;
var
  chGuid : TGUID;
  szGuid : DWORD;
  szName : DWORD;
  chName : PChar;
  stName : String;
  Idx : Integer;
  Ret : Integer;

  PowerPlan : TPowerPlan;

  iEnum : DWORD;
begin
  FItems.Clear;
  Idx := 0;

  szGuid := SizeOf(TGUID);

  GetMem(chName,BufferLength*SizeOf(Char));

  Try
    iEnum := PowerEnumerate(0{Nil},Nil,Nil,ACCESS_SCHEME,Idx,chGuid,szGuid);
    While iEnum = 0 Do
      Begin
        // Reinitialize buffer and buffer size
        // Undocumented in MSDN: even when PowerReadFriendlyName success,
        // it overwrites buffer size
        szName := BufferLength;
        ZeroMemory(chName,BufferLength*SizeOf(Char));

        Ret := PowerReadFriendlyName(Nil,@chGuid,Nil,Nil,PUCHAR(chName),@szName);
        if Ret = 0
          Then stName := StrPas(chName)
          Else
            If Not PowerReadWellKnownFriendlyName(chGuid,stName)
              Then stName := 'Unknown plan';

        PowerPlan.Index := Idx;
        PowerPlan.Guid := chGuid;
        PowerPlan.Name := stName;
        FItems.Add(PowerPlan);

        Inc(Idx);

        iEnum := PowerEnumerate(0{Nil},Nil,Nil,ACCESS_SCHEME,Idx,chGuid,szGuid);
      End;
  Finally
    FreeMem(chName,szName*SizeOf(Char));
  End;
end;

Но тут есть такой момент. Все прекрасно работает под Win32, а под Win64 возвращает ошибку (87, вроде это про неправильный параметр).
Если у кого есть мысль что в этом коде неправильно - подскажите.
Ответить с цитированием