我正在尝试用 Java 映射 Windows Native Wifi API,但 WlanEnumInterfaces 函数遇到问题。基本上,该函数输出一个包含 WLAN_INTERFACE_INFO 结构数组的 WLAN_INTERFACE_INFO_LIST 结构。 当我在Java程序中调用WlanEnumInterfaces时,它的返回值表明函数成功,但是当我检查WLAN_INTERFACE_INFO数组中的项目数时,我得到不一致的值,例如1367280或4000000。这个值应该是1,因为我只有我的机器上有一个无线接口(interface)。 这是我对 WlanEnumInterfaces 函数的映射:
public int WlanEnumInterfaces(
HANDLE hClientHandle,
PointerByReference pReserved,
WLAN_INTERFACE_INFO_LIST.ByReference ppInterfaceList);
WLAN_INTERFACE_INFO_LIST 的实现:
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"});
}
}
以及调用该函数的部分代码:
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());
然后您需要一个基于 Pointer
的 WLAN_INTERFACE_INFO_LIST
构造函数,即
WLAN_INTERFACE_INFO_LIST(Pointer p) {
super(p);
this.dwNumberOfItems = p.readInt(0);
this.InterfaceInfo = new WLAN_INTERFACE_INFO[this.dwNumberOfItems];
read();
}
关于java - Java 中 WlanEnumInterfaces(Windows Native WiFi)的奇怪返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23348600/