Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

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

Есть такая функция:
Код:
1
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';

Вызов:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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, вроде это про неправильный параметр).
Если у кого есть мысль что в этом коде неправильно - подскажите.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:27.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025