gpt4 book ai didi

java - 将 HWND 从 Java 程序传递到 C 库

转载 作者:太空宇宙 更新时间:2023-11-04 08:05:00 31 4
gpt4 key购买 nike

我的任务是将 C# Windows 窗体 GUI 转换为 Java Swing GUI。我必须使用用 C 编写的同一个库。库中的一个函数需要窗口的 native 句柄才能将 C 程序链接到窗口。在 C# 代码中, native 句柄的使用相当简单,将 Intptr 传递给函数。在 Java 中则是另一回事。我找到了一种使用 JNA(Java native 访问)和 HWND 表示 native 句柄来获取窗口句柄的方法。问题是当我使用 HWND 提供句柄时,每次都会弹出无效的内存访问异常。这是我正在使用的代码。

主类:

    public class main {
public static void main(String[] args) {
JFrame jFrame = new JFrame();
jFrame.setSize(5000,5000);
jFrame.setVisible(true);
final HWND ptrRef = new HWND(Native.getComponentPointer(jFrame));
CLibrary cl = CLibrary.INSTANCE;
System.out.println("Handle: "+ptrRef);
String sPath = "C:\\Users\\markm\\IdeaProjects\\JFrameHandle\\Release";
cl.clStart(ptrRef, sPath, true);

}

}

C库接口(interface):

    public interface CLibrary extends Library {
Clibrary INSTANCE = (CLibrary) Native.loadLibrary("C:\\Users\\markm\\IdeaProjects\\JFrameHandle\\Release\\clibrary",CLibrary.class);
void clStart(HWND parent, String libraryPath, boolean hidePanel);
}

不幸的是,我无法访问 C 代码,因为我只有 .dll 文件,但在我可以访问该代码之前,我需要知道我是否做错了什么。如果有人能给我指出正确的方向,说明如何使用窗口句柄,或者可能有一种方法可以在另一端通过 JNI 传递句柄,请发表评论,我可以使用我能得到的所有帮助。

提前致谢。

最佳答案

无效内存访问错误表示您没有为传递给函数的任何指针分配 native 端内存。由于字符串和 boolean 值不是问题,您知道传递 HWND 不是正确的映射。

在没有看到 C API 的情况下,我只能猜测,但根据你对它的描述,它采用 IntPtr 它期望 native 地址为整数(intlong 取决于 32 位或 64 位)。

我怀疑您需要将接口(interface)映射更改为 longint 并传递 Pointer.nativeValue(HWND.getPointer())给它。 (或者简化您的代码以绕过 HWND 存储,并简单地使用 Pointer.nativeValue(Native.getComponentPointer(jFrame)) 初始获取整数。)

关于java - 将 HWND 从 Java 程序传递到 C 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43431947/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com