【发布时间】:2017-04-15 22:35:51
【问题描述】:
我的任务是将 C# Windows 窗体 GUI 转换为 Java Swing GUI。我必须使用用 C 编写的同一个库。库中的一个函数需要窗口的本机句柄才能将 C 程序链接到窗口。在 C# 代码中,本机句柄的使用相当简单,并且将 Intptr 传递给函数。在java中,情况就不同了。我找到了一种使用 JNA(Java Native Access)和 HWND 本地句柄表示来获取窗口句柄的方法。问题是当我使用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);
}
}
CL 库接口:
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 传递句柄,请发表评论,我可以使用我能获得的所有帮助。
提前致谢。
【问题讨论】:
-
这个 C 库到底在做什么,它应该直接操作托管运行时拥有的 GUI 窗口?
-
由于您使用的是 dll,因此您有效地绑定了 Windows 操作系统。重写的意义何在?
-
@chrylis - C 库在主窗口上放置了一个“窗口”。这就是为什么我试图将主窗口的句柄传递给库,以便它具有点引用
-
@Amit - 我知道这可能很奇怪,但有必要证明它也可以在 java 中完成。我是学生,这是一项作业,所以对不起,我不能就这个问题争论。
-
我必须使用用 C 语言编写的同一个库。 谁说的? 为什么?这个 C 库是为在 C# 创建的窗口上工作而编写的?有人认为它在 Java 创建的窗口上也能正常工作吗?福特皮卡的零件可以在丰田普锐斯上使用吗?听起来你被赋予了一项不可能完成的任务。
标签: java c java-native-interface jna window-handles