Java:JNA SystemParametersInfo参数类型
我只是开始用JNA做实验,一直试图调用这个函数,但没有异常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
本机原型:
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中创建引用类型的技巧是使用数组数据类型(JNAByReference
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);