gpt4 book ai didi

java - JNA 中的 RasEnumConnections 函数返回不完整的数据。我做错了什么?

转载 作者:太空宇宙 更新时间:2023-11-04 09:50:07 24 4
gpt4 key购买 nike

JNA 中实现的 RasEnumConnections 函数返回不完整的数据。
怎么了?这是我的代码:

public static void main(String[] args) {

Connected();
}

private static void Connected () {
boolean state = false;
ArrayList<String> connectedNames = new ArrayList<>();
IntByReference lpcb = new IntByReference(0);
IntByReference lpcConnections = new IntByReference(0);
Rasapi32.INSTANCE.RasEnumConnections(null, lpcb,lpcConnections);

WinRas.RASCONN conn = new WinRas.RASCONN();
conn.dwSize = lpcb.getValue();
WinRas.RASCONN[] connArray;
if(lpcConnections.getValue() > 0)
connArray = (WinRas.RASCONN[])conn.toArray(lpcConnections.getValue());
else
connArray = (WinRas.RASCONN[])conn.toArray(1);
System.out.println("lpcb: " + lpcb.getValue() + " lpcConnections: " + lpcConnections.getValue() + " RASCONN Size: " + conn.dwSize);
int error = Rasapi32.INSTANCE.RasEnumConnections(connArray, lpcb,lpcConnections);

if(error == WinError.ERROR_SUCCESS) {
System.out.println("Entry name: " + Native.toString(connArray[0].szEntryName)
+ " Guid string: " + connArray[0].guidEntry.toGuidString());
System.out.println(connArray[0].guidEntry.Data1);
System.out.println(connArray[0].guidEntry.Data2);
System.out.println(connArray[0].guidEntry.Data3);

}
else System.out.println("Error: " + error);

WinRas.RASENTRY.ByReference entry = getPhoneBookEntry("test1");
if(entry != null) {
System.out.println("test1 guid: "+ entry.guidId.toGuidString());
System.out.println(entry.guidId.Data1);
System.out.println(entry.guidId.Data2);
System.out.println(entry.guidId.Data3);
}

else System.out.println("Error: " + Native.getLastError());

}
}

In debugger:

字符数组 szEntryName 仅包含连接名称的最后 3 个字符。 (连接名称为“test1”)

最佳答案

正如我在评论中指出的,调试输出为您提供了有关正在发生的情况的强烈提示。缺少的“t”和“e”字符在 JNA 预期的 64 位指针中显示为 0x74 和 0x65。逻辑结论是 Windows 返回一个 32 位指针,后跟字符串,比 JNA 预期早 4 个字节。

RasEnumConnections 声明了有关您作为 connArray 传递的缓冲区的一些信息:

On input, an application must set the dwSize member of the first RASCONN structure in the buffer to sizeof(RASCONN) in order to identify the version of the structure being passed.

在上面的示例代码中,您将此值保留为与初始返回的值相同。这指定了结构的“错误”版本。相反,您应该将 dwSize 成员设置为 JNA 结构中所需的大小:

conn.dwSize = conn.size();

实际上,RASCONN sets this for you 的构造函数!所以你实际上不必这样做。但在上面的代码示例中,您正在覆盖预先设置的内容;只需删除您的 conn.dwSize 行即可。

请注意,由于您现在通过定义结构大小来请求(每个数组元素 4 字节)更大的缓冲区,因此您还需要在(第二个)RasEnumConnections() 调用中传递增加的大小。它设置为元素数乘以(较小的)结构大小,但您应该重置为元素数乘以(较大的)大小,如下所示:

lpcb.setValue(conn.size() * lpcConnections.getValue());

在获取完整数组之前。否则您将收到错误 632(结构大小不正确)。

作为引用(或者可能是您自己的代码的合适替代品),请查看 getRasConnection(String connName) method in JNA's Rasapi32Util.java class 中实现的代码。 .

关于java - JNA 中的 RasEnumConnections 函数返回不完整的数据。我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54879439/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com