Java中WlanEnumInterfaces(Windows本机WiFi)的奇数返回
我正在尝试用Java映射Windows本机Wifi API,但WlanEnumInterfaces函数有问题。基本上,此函数输出一个包含WLAN接口信息结构数组的WLAN接口信息列表结构。 当我在Java程序中调用WlanEnumInterfaces时,其返回值表示函数成功,但当我检查WLAN_INTERFACE_INFO数组中的项数时,会得到不一致的值,如1367280或4000000。此值应为1,因为我的计算机上只有一个无线接口。 这是我对WlanEnumInterfaces函数的映射:Java中WlanEnumInterfaces(Windows本机WiFi)的奇数返回,java,native,jna,wifi,Java,Native,Jna,Wifi,我正在尝试用Java映射Windows本机Wifi API,但WlanEnumInterfaces函数有问题。基本上,此函数输出一个包含WLAN接口信息结构数组的WLAN接口信息列表结构。 当我在Java程序中调用WlanEnumInterfaces时,其返回值表示函数成功,但当我检查WLAN_INTERFACE_INFO数组中的项数时,会得到不一致的值,如1367280或4000000。此值应为1,因为我的计算机上只有一个无线接口。 这是我对WlanEnumInterfaces函数的映射: p
public int WlanEnumInterfaces(
HANDLE hClientHandle,
PointerByReference pReserved,
WLAN_INTERFACE_INFO_LIST.ByReference ppInterfaceList);
HANDLE wlanHandle = getWlanHandle();
WLAN_INTERFACE_INFO_LIST.ByReference ppInterfaceList = new WLAN_INTERFACE_INFO_LIST.ByReference();
int ret = Wlanapi.INSTANCE.WlanEnumInterfaces(wlanHandle,null,ppInterfaceList);
System.out.println("Return: " + ret);
System.out.println("WlanEnumInterfaces->number of items: "+ppInterfaceList.dwNumberOfItems);
无线局域网接口信息列表的实现:
public static class WLAN_INTERFACE_INFO_LIST extends Structure {
public static class ByReference extends WLAN_INTERFACE_INFO_LIST implements Structure.ByReference{}
public int dwNumberOfItems;
public int dwIndex;
public WLAN_INTERFACE_INFO[] InterfaceInfo = new WLAN_INTERFACE_INFO[10];
@Override
protected List getFieldOrder() {
return Arrays.asList(new String[] {"dwNumberOfItems","dwIndex","InterfaceInfo"});
}
}
以及调用函数的部分代码:
public int WlanEnumInterfaces(
HANDLE hClientHandle,
PointerByReference pReserved,
WLAN_INTERFACE_INFO_LIST.ByReference ppInterfaceList);
HANDLE wlanHandle = getWlanHandle();
WLAN_INTERFACE_INFO_LIST.ByReference ppInterfaceList = new WLAN_INTERFACE_INFO_LIST.ByReference();
int ret = Wlanapi.INSTANCE.WlanEnumInterfaces(wlanHandle,null,ppInterfaceList);
System.out.println("Return: " + ret);
System.out.println("WlanEnumInterfaces->number of items: "+ppInterfaceList.dwNumberOfItems);
有人知道发生了什么吗?
谢谢 WlanEnumInterfaces用结构的地址填充您提供的字段。您传递的是结构的地址,而不是地址的地址 使用
PointerByReference
获取结构的地址,例如
PointerByReference pref = new PointerByReference();
Wlanapi.INSTANCE.WlanEnumInterfaces(handle, null, pref);
WLAN_INTERFACE_INFO_LIST list = new WLAN_INTERFACE_INFO_LIST(pref.getValue());
然后,您需要一个基于指针的构造函数,用于WLAN\u接口\u信息\u列表
,即
WLAN_INTERFACE_INFO_LIST(Pointer p) {
super(p);
this.dwNumberOfItems = p.readInt(0);
this.InterfaceInfo = new WLAN_INTERFACE_INFO[this.dwNumberOfItems];
read();
}
事实上,我一直在苦苦挣扎,因为我不知道如何操纵PointerByReference来获取WLAN\u接口\u信息\u列表。秘密是基于指针的构造函数。非常感谢。