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