Java:JNA SystemParametersInfo参数类型

Java:JNA SystemParametersInfo参数类型,java,pointers,jna,Java,Pointers,Jna,我只是开始用JNA做实验,一直试图调用这个函数,但没有异常 本机原型: BOOL WINAPI SystemParametersInfo( __in UINT uiAction, __in UINT uiParam, __inout PVOID pvParam, __in UINT fWinIni ); 我提出了类似于JNA的建议: public interface User32 extends StdCallLibrary { Use

我只是开始用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_GetDeskWallper(其中为char[])

解决了我自己的问题,因此映射:

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

一种方法是重载
User32.SystemParametersInfo
方法,其中
pvParam
(注意
\u inout
宏)是引用类型(因为Java参数是按值传递的)。在JNA中创建引用类型的技巧是使用数组数据类型(JNA
ByReference
types除外)。因此,pvParam可以是
PointerByReference
boolean[]
char[]
,等等。然后,通过它的元素索引访问数据,例如
pvParam[0]
(取决于它的数据是什么)哦,谢谢,我三周前已经解决了这个问题。事实证明,我无法使其工作的主要原因是误解了JNA类型指针的工作原理。我想现在晚一点再回答;-)
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);