|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
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, вроде это про неправильный параметр). Если у кого есть мысль что в этом коде неправильно - подскажите. |