Java: тип параметров JNA SystemParametersInfo

Я только начал экспериментировать с JNA и застрял, пытаясь вызвать эту функцию без исключения
Родной прототип:

BOOL WINAPI SystemParametersInfo(
  __in     UINT uiAction,
  __in     UINT uiParam,
  __inout  PVOID pvParam,
  __in     UINT fWinIni
);

Я предложил такой эквивалент JNA:

public interface User32 extends StdCallLibrary {
        User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);

        boolean SystemParametersInfo(
                UINT_PTR uiAction,
                UINT_PTR uiParam,
                Pointer pvParam,
                UINT_PTR fWinIni
        );
        public static final int SPI_GETCLEARTYPE = 0x1048;
        public static final int SPI_GETDESKWALLPAPER = 0x0073;
}

И вопрос в том, как вызывать его с разными типами pvParam с помощью указателя?
например SPI_GETCLEARTYPE (где BOOL) и SPI_GETDESKWALLPAPER (где char[])


person Dagon    schedule 27.02.2011    source источник
comment
Один из способов сделать это — перегрузить метод User32.SystemParametersInfo, где pvParam (обратите внимание на макрос _inout) имеет ссылочный тип (поскольку параметры Java передаются по значению). Трюк для создания ссылочного типа в JNA заключается в использовании типа данных массива (за исключением типов JNA ByReference). Таким образом, pvParam может быть PointerByReference, boolean[], char[] и т. д. Затем доступ к данным осуществляется по индексу его элемента, например. pvParam[0] (в зависимости от того, какие у него данные)   -  person eee    schedule 04.04.2011
comment
о, спасибо, уже решил это сам 3 недели назад. Как оказалось, основная причина, по которой я не мог заставить это работать, - это непонимание того, как работает указатель типа JNA. Чуть позже дам самостоятельный ответ   -  person Dagon    schedule 05.04.2011
comment
Я думаю, что сейчас немного позже ;-)   -  person Hannes de Jager    schedule 12.04.2011


Ответы (1)


Решил сам так отображение:

    public interface User32 extends StdCallLibrary {
        User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class,
            new HashMap<Object, Object>() {
            {
                put(OPTION_TYPE_MAPPER, W32APITypeMapper.UNICODE);
                put(OPTION_FUNCTION_MAPPER, W32APIFunctionMapper.UNICODE);
            }
        });
        public static final int SPI_GETDESKWALLPAPER = 0x0073;
        public static final int SPI_GETSCREENSAVERRUNNING = 114;
        boolean SystemParametersInfo(
                int uiAction,
                int uiParam,
                Pointer pvParam,
                int fWinIni
        );
    }

и использование:

IntByReference intPtr = new IntByReference();
//that's the place where i'm stuck trying to initialize with Pointer constructor
Pointer ptr = new Memory(Pointer.SIZE * 256);
User32.INSTANCE.SystemParametersInfo(User32.SPI_GETSCREENSAVERRUNNING, 0,intPtr.getPointer(), 0);
User32.INSTANCE.SystemParametersInfo(User32.SPI_GETDESKWALLPAPER,256, ptr, 0);
person Dagon    schedule 20.04.2011