|
|
Регистрация | << Правила форума >> | 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, вроде это про неправильный параметр). Если у кого есть мысль что в этом коде неправильно - подскажите. |
#2
|
||||
|
||||
Вот на х64 работает, на х32 нет возможности проверить - на виртуалке только WindowsXP, а там и не будет работать:
Код:
function PowerEnumerate(RootPowerKey: HKEY; SchemeGuid: PGUID; SubGroupOfPowerSettingsGuid: PGUID; AccessFlags: DWORD; Index: ULONG; Buffer: Pointer; var BufferSize: DWORD): DWORD; stdcall; external 'powrprof.dll'; function PowerReadFriendlyName( RootPowerKey: HKEY; SchemeGuid: PGUID; SubGroupOfPowerSettingsGuid: PGUID; PowerSettingGuid: PGUID; Buffer: Pointer; var BufferSize: DWORD ): DWORD; stdcall; external 'powrprof.dll'; const ACCESS_SCHEME = 16; procedure TForm1.FormCreate(Sender: TObject); var Buffer: TGUID; BufferSize: DWORD; LIndex: ULONG; LPowerEnumerate: DWORD; BufferName: array [0..$FF] of Char; begin LIndex:=0; repeat BufferSize:=SizeOf(TGUID); LPowerEnumerate:=PowerEnumerate(0, nil, nil, ACCESS_SCHEME, LIndex, @Buffer, BufferSize); if LPowerEnumerate=ERROR_SUCCESS then begin Memo1.Lines.Add(GUIDToString(Buffer)); BufferSize:=Length(BufferName); if PowerReadFriendlyName(0, @Buffer, nil, nil, @BufferName[0], BufferSize)<>ERROR_SUCCESS then RaiseLastOSError; Memo1.Lines.Add(BufferName); end; Inc(LIndex); until LPowerEnumerate<>ERROR_SUCCESS; end; Результат: Цитата:
Пишу программы за еду. __________________ |
#3
|
|||
|
|||
Да, вроде, код такой-же...
Ладно, проверю что там с ULong... это, по факту, единственная разница. ЗЫ. Я все на 64-бит ОС проверял, просто сборка 32- и 64-бит. 32 работает, а 64 - нет. ОС - Win10, если что... |
#4
|
||||
|
||||
Цитата:
Помогаю платно. Помогаю иногда бесплатно. |
#5
|
|||
|
|||
Короче, расковыряли.
Оказывается, под 64 бита дефолтный enum не совместим с С кодом, хотя он и с 32 битным не совместим, но там почему-то работает. Либо ставим {$Z4}, либо вообще декларируем как NativeUInt и все работает. Вот ведь... |