我正在尝试通过Java加载DEVMODE。
如下面的链接,我创建了一个扩展com.sun.jna.Structure的类SampleClass。 在SampleClass构造函数中,我调用#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];
答案 0 :(得分:0)
从现有Structure
初始化Pointer
的正确方法是使用基于Pointer
的构造函数,例如
public class MyClass extends Structure {
public char[] buffer = new char[32];
public MyClass(Pointer p) {
super(p);
read();
}
}
这可以避免使用默认构造函数进行多余的内存分配。
请注意DEVMODE
有一个union字段,您应该在调用Structure.read()
之前设置其类型。在这种情况下,如果你不这样做,它可能会受到伤害,因为这些字段都是原语,但你可能不得不在联合字段上手动调用Structure.read()
。
当您在-Djna.dump_memory=true
上调用toString()
时,可以使用系统属性Structure
查看与Java字段相关的本机内存内容。这可以帮助您确定是否缺少字段或填充,或者字段类型不正确。