在 JNA 中分配 WinDef.RECT 结构

Allocating WinDef.RECT struct in JNA

本文关键字:RECT 结构 WinDef 分配 JNA      更新时间:2023-10-16

我有一个 C 函数(编译成 DLL),它接受一个WinDef.RECT对象并打印出四个坐标:

DllExport void Test(RECT rect)
{
    printf("Rect: %i, %i, %i, %i", rect.top, rect.left, rect.bottom, rect.right);
}

在Java(JNA)方面,我试图通过如下WinDef.RECT传递它:

WinDef.RECT rect = new WinDef.RECT();
rect.bottom=0;
rect.left=0;
rect.right=0;
rect.top=0;
jna.INSTANCE.Test(rect);

但是,我只是得到无意义的数字(不一致并且每次都不同),例如:

Rect: -857788769, 11343200, 8044544, 8044544

我假设我没有在 JNA 端正确定义 RECT(C++函数可以从同一 dll 中的其他本机函数调用),但除此之外,我有点卡住了!

我在JNA邮件列表中有一个有用的答案:

您的本机签名要求结构,而您的 JNA 映射默认为 struct* 语义。 更改您的本机签名或使用 Structure.ByValue;struct* 是首选,除非您明确需要其他情况。

就我而言,我需要本机库保持不变,因此解决方案是声明一个WinDef.RECT子类并用Structure.ByValue标记它:

public static class RectByValue extends WinDef.RECT implements Structure.ByValue {}

然后可以使用它来代替WinDef.RECT,并且一切似乎都没有问题。

请注意,虽然此修复程序对我来说效果很好,但其他人则报告了其他情况 - 如下面的评论所示,将类型切换到LPRECT是另一个潜在的修复程序。