如何使用jna Structure类加载DEVMODE而不出现乱码

How Can I load DEVMODE using jna Structure class without garbling

本文关键字:DEVMODE 何使用 jna Structure 类加载      更新时间:2023-10-16

我正在尝试通过Java加载DEVMODE。

按照下面的链接,我创建了一个类SampleClass,它扩展了com.sun.jna.Structure。在SampleClass构造函数中,我调用#useMemory(指针m),然后调用#read()。在我调用它的构造函数之后,每个字段都有值。它看起来很好,但char[]的值看起来很混乱。所以我想知道加载DEVMODE的正确方法。

https://msdn.microsoft.com/en-us/library/windows/desktop/dd183565(v=vs.85).aspx

乱码场在下面。

public char[] dmDeviceName = new char[32];

从现有Pointer初始化Structure的正确方法是使用基于Pointer的构造函数,例如

public class MyClass extends Structure {
    public char[] buffer = new char[32];
    public MyClass(Pointer p) {
        super(p);
        read();
    }
}

这避免了在默认构造函数中出现多余的内存分配。

请注意,DEVMODE有一个并集字段,您可能应该在调用Structure.read()之前设置其类型。在这种情况下,如果不这样做可能不会有什么影响,因为字段都是基元,但您可能必须手动调用并集字段上的Structure.read()

当您在Structure上调用toString()时,您可以使用系统属性-Djna.dump_memory=true来查看本地内存相对于Java字段的内容。这可以帮助您确定是否缺少字段或填充,或者字段类型大小不正确。