Java: тип параметров JNA SystemParametersInfo - PullRequest
1 голос
/ 27 февраля 2011

Я только начал экспериментировать с 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 [])

1 Ответ

2 голосов
/ 21 апреля 2011

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

    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);
...