当前位置: 首页 > 知识库问答 >
问题:

如何使用JNA正确映射`MagImagEscalingCallback`?

欧阳鸿德
2023-03-14

我在我的Java项目中使用了jna.jar、jna-3.2.5.jar和jna-3.3.0-platform.jar。

这是我要复制的Winapi函数。

BOOL WINAPI MagImageScalingCallback(
  _In_  HWND           hwnd,
  _In_  void           *srcdata,
  _In_  MAGIMAGEHEADER srcheader,
  _Out_ void           *destdata,
  _In_  MAGIMAGEHEADER destheader,
  _In_  RECT           unclipped,
  _In_  RECT           clipped,
  _In_  HRGN           dirty
);

这是我的Java代码

public interface MagImageScalingCallback extends StdCallLibrary.StdCallCallback{
    public boolean MagImageScalingCallback(HWND hwnd,
            Pointer srcdata,
            MAGIMAGEHEADER.ByValue srcheader,
            Pointer destdata,
            MAGIMAGEHEADER.ByValue destheader,
            RectByValue source,
            RectByValue clipped,
            HRGN dirty);
}

当我进入回调的这个方法时,我得到了意想不到的结果:

    public boolean MagImageScalingCallback(HWND hwnd, Pointer srcdata,
            MAGIMAGEHEADER.ByValue srcheader, Pointer destdata,
            MAGIMAGEHEADER.ByValue destheader, RectByValue source, RectByValue clipped, HRGN dirty) {
        image.setRGB(0, 0, srcheader.width, srcheader.height, srcdata.getIntArray(0, srcheader.width * srcheader.height ), 0, srcheader.width);
        return true;
    }

这个表解释了当我改变变量的数据类型时,在32位和64位系统中什么是有效的,什么是无效的。

+--------------+--------------+-------------+-------------+
| Parameter    | Data type    |   64 bit    |   32 bit    |
+--------------+--------------+-------------+-------------+
| source       | WinDef.RECT  |   Working   | Not Working |
| clipped      | WinDef.RECT  |   Working   | Not Working |
| source       | RectByValue  |   Working   |   Working   |
| source       | RectByValue  |   Working   |   Working   |
| srcdata      | Pointer      |   Working   | Not Working |
| destdata     | Pointer      |   Working   | Not Working |
+--------------+--------------+-------------+-------------+

不工作意味着结果中的图像完全是黑色的

@David-Heffernan我在32位系统上运行这段代码。我知道WOW64不支持放大API;。这意味着32位放大应用程序可以在32位系统上工作,64位放大应用程序可以在64位系统上工作。请停止评论放大API在WOW64上不起作用,尝试在32位系统上执行此代码。

对于您的要求,下图显示了我的系统配置。

共有1个答案

时恩
2023-03-14

回调是正确的--除了使用不推荐的函数之外,代码中没有任何缺陷。

考虑使用以下内容:

try {
    Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
    BufferedImage  capture = new Robot().createScreenCapture(screenRect);
    ImageIO.write(capture, "JPEG", new File("printed1.jpg"));
} catch (Exception e) {
    e.printStackTrace();
}
 类似资料:
  • 问题内容: 我有以下枚举如何在jna中映射? 该枚举在结构上进一步引用。 阿卜杜勒·哈利克(Abdul Khaliq) 问题答案: 如果使用的是JNA,则可能要显式指定Java中的枚举值。默认情况下,Java的基本枚举类型并没有真正为您提供该功能,您必须为EnumSet添加一个构造函数(请参阅this和this)。 编码C枚举的一种简单方法是使用包装在与枚举同名的类中的公共静态最终const in

  • 我有麻烦映射一个嵌套dto字段正确与MapStruct。我有几个DTO: 具有相应的映射器 到目前为止,一切工作都很好,生成的代码自动连接其他需要的映射器来正确地构建DTO。例如生成的仪器映射器实现 现在,当我试图创建一个包含嵌套工具dto的映射器时遇到了麻烦。映射器应使用instrumentMapper正确创建所需的dto。DTO: 映射器: 生成的代码: 现在media mapper得到了很好

  • 错误:由于隐式依赖模块中缺少导出函数,至少有一个模块具有未解析的导入。错误:发现具有不同CPU类型的模块。 但是这个DLL是从另一个运行良好的DLL派生出来的(尽管它是从VB代码调用的),但它也抛出了同样的两个错误。 最后,我是这样称呼它的:

  • 问题内容: 我的代码有最后一个问题,涉及反射包中的.Call函数。 所以我在打这样的电话: 我正在执行.Call的方法如下: 我不太了解的是如何操作“ in”变量,以便将需要的映射正确传递到函数中。我看到make()中的第二个参数是参数的长度吗?但是我不太了解如何格式化var以正确传递参数。我递归地遇到错误消息: 任何帮助将非常感激! 问题答案: 来自: 呼叫调用函数与输入参数。例如,如果,代表去

  • 仅供参考:我已经删除了所有apache默认的webapp文件,并启动了我自己的项目,因此可以使用访问它,这很好。 我在驱动器中的servlet位置: 我在eclipse IDE中的包:eclipse IDE映像中的包 和我的web.xml文件: 我的HTML表单: 感谢所有的回复:)

  • 问题内容: 我正在尝试设置控制器,但是很遗憾无法查看输出…一切都正确呈现。当我转到404页面时。从Netbeans运行我的应用程序转到 app-config.xml web.xml 我如何调试它,看看有什么用,什么没用? 更新资料 Netbeans中的GlassFish服务器日志显示 问题答案: 您的名字映射到中吗?从您先前的问题中,我看到: 网址不匹配格式。尝试一种可能的解决方法。

  • 问题内容: 我正在使用python-spidermonkey,它在内部使用PyMapping_Check来识别用作全局对象(在rt.new_context(global)中)是否实现了映射协议。(这基本上是传递给python- spidermonkey的字典,因此javascript对python变量的访问受到限制。) 我无法在Python中找到映射协议的正式定义,因此我一直在尝试和尝试确定其中的

  • 我有以下POJO,可以序列化为字节或。 当试图反序列化正文时,该错误似乎是从请求类生成的: 我怎样才能正确地反序列化地图?