在 JNA 中分配 WinDef.RECT 结构
Allocating WinDef.RECT struct in JNA
我有一个 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
是另一个潜在的修复程序。
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 奇怪的结构&GCC&clang(void*返回类型)
- 在 c++ 中拥有一组结构的正确方法是什么?
- 在 JNA 中分配 WinDef.RECT 结构
- RECT,将自定义的RECT结构传递到需要RECT的函数中