Я хотел бы задать вопрос относительно метода P / Invoke.Я пишу в C # и хотел бы получить доступ к API управления питанием (powrprof.dll) метод "ReadProcessorPwrScheme".К сожалению, я не получаю правильные значения и подозреваю, что у меня могут быть проблемы с маршалингом.Буду признателен за любую оказанную помощь.Некоторые из имеющихся у меня кодов:
struct PROCESSOR_POWER_POLICY_INFO
{
public uint TimeCheck; // ULONG
public uint DemoteLimit; // ULONG
public uint PromoteLimit; // ULONG
public byte DemotePercent;
public byte PromotePercent;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] Spare;
public uint AllowDemotion;
public uint AllowPromotion;
public uint Reserved;
}
struct PROCESSOR_POWER_POLICY
{
public uint Revision; // DWORD
public byte DynamicThrottle;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] Spare;
public uint DisableCStates; // DWORD
public uint Reserved; // DWORD
public uint PolicyCount; // DWORD
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public PROCESSOR_POWER_POLICY_INFO[] Policy;
}
struct MACHINE_PROCESSOR_POWER_POLICY
{
public uint Revision; // ULONG
public PROCESSOR_POWER_POLICY ProcessorPolicyAc;
public PROCESSOR_POWER_POLICY ProcessorPolicyDc;
}
[DllImport("powrprof.dll", SetLastError = true)]
static extern bool ReadProcessorPwrScheme(uint uiID, out MACHINE_PROCESSOR_POWER_POLICY pMachineProcessorPowerPolicy);
public void ReadProcessorPowerScheme()
{
MACHINE_PROCESSOR_POWER_POLICY mppp = new MACHINE_PROCESSOR_POWER_POLICY();
uint schemeID0 = 0;
if (ReadProcessorPwrScheme(schemeID0, out mppp))
{
Console.WriteLine(mppp.ProcessorPolicyAc.DynamicThrottle);
Console.WriteLine(mppp.ProcessorPolicyDc.DynamicThrottle);
}
}
mppp.ProcessorPolicyAc.DynamicThrottle показывает правильное значение, но mppp.ProcessorPolicyDc.DynamicThrottle не показывает правильноезначение.У кого-нибудь есть подсказка или идея, что не так?
Дополнительная информация: Это работает на Win XP