JNA со сложной структурой

В конечном итоге я хочу определить, является ли машина, на которой работает моя программа, ноутбуком или настольным компьютером. Я хотел бы сделать это с помощью библиотеки JNA и msn PowrProf, GetPwrCapabilities Function с помощью флага LidPresent.

Часть структуры SYSTEM_POWER_CAPABILITIES (которая является аргументом для метода GetPwrCapabilities())

  BYTE                    spare2[3];
  BYTE                    spare3[8];
  BATTERY_REPORTING_SCALE BatteryScale[3];
  SYSTEM_POWER_STATE      AcOnLineWake;

Перечисление SYSTEM_POWER_STATE:

typedef enum _SYSTEM_POWER_STATE {
  PowerSystemUnspecified   = 0,
  PowerSystemWorking       = 1,
  PowerSystemSleeping1     = 2,
  PowerSystemSleeping2     = 3,
  PowerSystemSleeping3     = 4,
  PowerSystemHibernate     = 5,
  PowerSystemShutdown      = 6,
  PowerSystemMaximum       = 7 
} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;

Перечисление было объяснено здесь, на SO, но я не уверен, что делаю это правильно, потому что получаю эту ошибку:

Исключение в потоке «основной» java.lang.IllegalArgumentException: недопустимое поле структуры в классе JNAPlayground$PowrProf$SYSTEM_POWER_CAPABILITIES, имя поля «AcOnLineWake», интерфейс JNAPlayground$PowrProf$SYSTEM_POWER_STATE: тип «JNAPlayground$PowrProf$SYSTEM_POWER_STATE» не поддерживается: собственный размер типа "JNAPlayground$PowrProf$SYSTEM_POWER_STATE" неизвестен

Не могли бы вы направить меня или указать мне правильное направление для:
- Массивы
- Перечисление (если я ошибаюсь)
- Если я не импортирую достаточно библиотек

Мой код Java до сих пор:

public interface PowrProf extends StdCallLibrary
{
    PowrProf INSTANCE = (PowrProf) Native.loadLibrary(
            "C:\\WINDOWS\\system32\\PowrProf.dll", PowrProf.class);

    public static interface SYSTEM_POWER_STATE
    {
        public static final int owerSystemUnspecified = 0;
        public static final int PowerSystemWorking = 1;
        public static final int PowerSystemSleeping1 = 2;
        public static final int PowerSystemSleeping2 = 3;
        public static final int PowerSystemSleeping3 = 4;
        public static final int PowerSystemHibernate = 5;
        public static final int PowerSystemShutdown = 6;
        public static final int PowerSystemMaximum = 7;

    }

    public static class BATTERY_REPORTING_SCALE extends Structure
    {
        public long Granularity;
        public long Capacity;
    }

    public static class SYSTEM_POWER_CAPABILITIES extends Structure
    {
        public boolean PowerButtonPresent;
        public boolean SleepButtonPresent;
        public boolean LidPresent;
        public boolean SystemS1;
        public boolean SystemS2;
        public boolean SystemS3;
        public boolean SystemS4;
        public boolean SystemS5;
        public boolean HiberFilePresent;
        public boolean FullWake;
        public boolean VideoDimPresent;
        public boolean ApmPresent;
        public boolean UpsPresent;
        public boolean ThermalControl;
        public boolean ProcessorThrottle;
        public int ProcessorMinThrottle;
        public int ProcessorMaxThrottle;
        public boolean FastSystemS4;
        public int spare2[] = new int[3];
        public boolean DiskSpinDown;
        public int spare3[] = new int[8];
        public boolean SystemBatteriesPresent;
        public boolean BatteriesAreShortTerm;
        public BATTERY_REPORTING_SCALE BatteryScale[] =  new BATTERY_REPORTING_SCALE[3];
        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;
    }

    void GetPwrCapabilities( SYSTEM_POWER_CAPABILITIES result );
}

Спасибо, Эрик


person Erik B    schedule 10.03.2010    source источник


Ответы (1)


После того, как я погуглил, я попытался вернуться на главную веб-страницу jna и проигнорировал другой вопрос перечисления здесь, на SO. Сопоставление перечисления находится здесь. Мой код теперь показывает, что крышка присутствует!

import com.sun.jna.Native;
import com.sun.jna.Structure;
import com.sun.jna.win32.StdCallLibrary;

public class JNAPlayground
{

    public interface PowrProf extends StdCallLibrary
    {
        PowrProf INSTANCE = (PowrProf) Native.loadLibrary(
                "C:\\WINDOWS\\system32\\PowrProf.dll", PowrProf.class);

        public static class BATTERY_REPORTING_SCALE extends Structure
        {
            public long Granularity;
            public long Capacity;
        }

        public static class SYSTEM_POWER_CAPABILITIES extends Structure
        {
            public boolean PowerButtonPresent;
            public boolean SleepButtonPresent;
            public boolean LidPresent;
            public boolean SystemS1;
            public boolean SystemS2;
            public boolean SystemS3;
            public boolean SystemS4;
            public boolean SystemS5;
            public boolean HiberFilePresent;
            public boolean FullWake;
            public boolean VideoDimPresent;
            public boolean ApmPresent;
            public boolean UpsPresent;
            public boolean ThermalControl;
            public boolean ProcessorThrottle;
            public int ProcessorMinThrottle;
            public int ProcessorMaxThrottle;
            public boolean FastSystemS4;
            public int spare2[] = new int[3];
            public boolean DiskSpinDown;
            public int spare3[] = new int[8];
            public boolean SystemBatteriesPresent;
            public boolean BatteriesAreShortTerm;
            public BATTERY_REPORTING_SCALE BatteryScale[] =  new BATTERY_REPORTING_SCALE[3];
            public int AcOnLineWake;
            public int SoftLidWake;
            public int RtcWake;
            public int MinDeviceWakeState;
            public int DefaultLowLatencyWake;
        }

        void GetPwrCapabilities( SYSTEM_POWER_CAPABILITIES result );
    }

    public static void main( String[] args )
    {
        PowrProf lib2 = PowrProf.INSTANCE;
        PowrProf.SYSTEM_POWER_CAPABILITIES systemPOWERCAPABILITIES = new PowrProf.SYSTEM_POWER_CAPABILITIES();
        lib2.GetPwrCapabilities(systemPOWERCAPABILITIES);

        System.out.println("Lid present:" + systemPOWERCAPABILITIES.LidPresent);
    }
}
person Erik B    schedule 10.03.2010
comment
Этот код запускается, но выводит Lid present:true на каждом компьютере, на котором я его запускаю. - person Erik B; 11.03.2010
comment
@ErikB тебе повезло с этим? Я столкнулся с похожей проблемой. Пожалуйста, также ответьте на вопрос Бьярке Фройнд-Хансен, потому что он заметно опущен во втором сообщении. Спасибо - person amadib; 14.02.2014
comment
@BjarkeFreund-Hansen Извините, я не понимаю вашего вопроса. - person Erik B; 14.02.2014
comment
@ErikB: Моему комментарию два с половиной года, я понятия не имею, что я комментировал. - person Bjarke Freund-Hansen; 14.02.2014