GetPwrCapabilities дает мне неверные результаты состояния сна на некоторых компьютерах. Как получить более точный результат?

У меня есть 64-битная машина Win7 Ultimate, на которой я вызываю GetPwrCapabilities. Однако он говорит мне, что состояние сна 4 (гибернация) недоступно и что нет файла гибернации. Я могу перевести машину в спящий режим, и есть файл гибернации. Я делаю что-то неправильно? Есть ли что-нибудь еще, что я могу позвонить, чтобы получить точные поддерживаемые состояния сна

Спасибо

EDIT Интересно, что powercfg -AVAILABLESTATES предоставляет правильную информацию. Кто-нибудь знает, какой API он вызывает или почему существует несоответствие

Добавление кода

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Xml.Serialization;
using System.IO;
using System.Diagnostics;

class Program
{
    [DllImport("PowrProf.dll")]
    public static extern bool GetPwrCapabilities(out SYSTEM_POWER_CAPABILITIES lpSystemPowerCapabilities);

    static void Main(string[] args)
    {
        SYSTEM_POWER_CAPABILITIES spc;
        bool well = GetPwrCapabilities(out spc);

        Stream stdOut = System.Console.OpenStandardOutput();
        XmlSerializer x = new XmlSerializer(typeof(SYSTEM_POWER_CAPABILITIES));
        x.Serialize(stdOut, spc);
    }
}

[Serializable]
public struct SYSTEM_POWER_CAPABILITIES
{
    public bool PowerButtonPresent;
    public bool SleepButtonPresent;
    public bool LidPresent;
    public bool SystemS1;
    public bool SystemS2;
    public bool SystemS3;
    public bool SystemS4;
    public bool SystemS5;
    public bool HiberFilePresent;
    public bool FullWake;
    public bool VideoDimPresent;
    public bool ApmPresent;
    public bool UpsPresent;
    public bool ThermalControl;
    public bool ProcessorThrottle;
    public byte ProcessorMinThrottle;
    public byte ProcessorMaxThrottle;
    public bool FastSystemS4;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public byte[] spare2;
    public bool DiskSpinDown;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
    public byte[] spare3;
    public bool SystemBatteriesPresent;
    public bool BatteriesAreShortTerm;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public BATTERY_REPORTING_SCALE[] BatteryScale;
    public SYSTEM_POWER_STATE AcOnLineWake;
    public SYSTEM_POWER_STATE SoftLidWake;
    public SYSTEM_POWER_STATE RtcWake;
    public SYSTEM_POWER_STATE MinDeviceWakeState;
    public SYSTEM_POWER_STATE DefaultLowLatencyWake;
}
public struct BATTERY_REPORTING_SCALE
{
    public UInt32 Granularity;
    public UInt32 Capacity;
}
public enum SYSTEM_POWER_STATE
{
    PowerSystemUnspecified = 0,
    PowerSystemWorking = 1,
    PowerSystemSleeping1 = 2,
    PowerSystemSleeping2 = 3,
    PowerSystemSleeping3 = 4,
    PowerSystemHibernate = 5,
    PowerSystemShutdown = 6,
    PowerSystemMaximum = 7
}

person Mark    schedule 24.10.2011    source источник
comment
Можете ли вы показать нам свой код? Вы используете код C или p/invoke? Возможно, вы неправильно маршалируете структуру SYSTEM_POWER_CAPABILITIES.   -  person Joel Spolsky    schedule 02.11.2011
comment
Добавлен пример кода. Я использую С# и PInvoke. Я возвращаю некоторые значения, так что что-то работает, но я думаю, возможно, я что-то пропустил. Это было бы прекрасно!   -  person Mark    schedule 17.11.2011


Ответы (1)


bool маршалируется как 4 байта. Это соответствует Win32 BOOL. Но Win32 BOOLEAN — это один байт, поэтому вам нужно пометить все члены bool SYSTEM_POWER_CAPABILITIES с помощью [MarshalAs(UnmanagedType.I1)].

person Werner Henze    schedule 18.01.2012