2010-07-21 4 views
1

Je voudrais poser une question concernant la méthode P/Invoke. Je code en C# et voudrais accéder à la méthode API Power Management (powrprof.dll) "ReadProcessorPwrScheme". Malheureusement, je n'obtiens pas les valeurs correctes et je soupçonne que je puisse être un problème dans le marshaling. Toute aide est très appréciée. Certains des codes que j'ai:L'appel de ReadProcessorPwrScheme() ne renvoie pas les valeurs correctes

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 montre la valeur correcte mais mppp.ProcessorPolicyDc.DynamicThrottle ne montre pas la valeur correcte. Quelqu'un at-il un indice ou une idée de ce qui ne va pas?

Informations complémentaires: Ceci est exécuté sur Win XP

+0

Veuillez ne pas mettre de balises comme "C#:" dans le titre. Laissez-les simplement dans les tags. –

Répondre

1

J'ai trouvé la solution à ma question. C'était mon malentendu sur la définition de la structure qui provoque la lecture des octets erronés. La définition de structure correcte est la suivante.

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; 
    public uint AllowBits; 
} 

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; 
} 
Questions connexes