如何使用 jna 结构 class 加载 DEVMODE 而不会出现乱码

How Can I load DEVMODE using jna Structure class without garbling

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

按照下面的 link,我创建了一个扩展 com.sun.jna.Structure 的 class SampleClass。 在 SampleClass Constructor 中,我调用了#useMemory(Pointer 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()

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