08.01.2018, 06:44
|
Модератор
|
|
Регистрация: 17.04.2008
Сообщения: 8,015
Версия 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, вроде это про неправильный параметр).
Если у кого есть мысль что в этом коде неправильно - подскажите.
|