如何使用 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 字段相对应的内容=].这可以帮助您确定您是否缺少字段或填充,或者字段类型大小不正确。
我正在尝试通过 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 字段相对应的内容=].这可以帮助您确定您是否缺少字段或填充,或者字段类型大小不正确。