问题是com.sun.jna.Native.getNativeSize(Class)不是在这种情况下使用的正确函数。 使用32位JVM时,问题是可见的(64位虚拟机不可见)。
对于结构,上面提到的函数假定它们通过引用传递(指向结构的指针),因此函数返回Native.POINTER_SIZE的值。 在64位虚拟机上,运气匹配POINT结构的大小。 在32位VM上, Native.POINTER_SIZE是4字节,因此只能保存结果结构的一部分。
最相关的部分:要确定JNA中结构的大小,请使用Structure#size函数。 在这种情况下,使用ReadProcessMemory的最终参数也很有帮助。 该函数返回读取的字节数并显示差异(4对8)。
进一步的评论:记得释放你分配的内存,并关闭收到的进程句柄。
这是完整的可运行样本(仅缺少导入,使用JNA 5.2测试):
public class Test {
private interface Kernel32 extends com.sun.jna.platform.win32.Kernel32 {
Kernel32 INSTANCE = Native.load("kernel32", Kernel32.class, W32APIOptions.DEFAULT_OPTIONS);
public Pointer VirtualAllocEx(HANDLE hProcess, Pointer lpAddress, SIZE_T dwSize, int flAllocationType, int flProtect);
public boolean VirtualFreeEx(HANDLE hProcess, Pointer lpAddress, S