将本机 Window 句柄传递给 Java 中的 DLL
Passing a Native Window Handle to a DLL in Java
为了解释问题我想最好解释(简化)我想做的事情。
有一个设备(相机)。此设备的 API 由本机 DLL 提供。此 DLL 中的一个函数需要一个本机 Window 句柄来直接在应用程序中绘制捕获的图像。 C# 的解决方案是将 PictureBox.Handle
传递给此函数。但是在 Java 中,绘图组件是 awt.Canvas
。此问题的较早实现是获得此 Canvas 的对等方,自 JDK 1.1 以来已弃用。另外我不知道这个方法是否一直有效。因此他们是两个问题:
被弃用的方法真的有效吗?
是否有任何其他可能的解决方案来将 window 句柄传递给 DLL?
这是 DLL 内部函数的签名:
int draw_func(..., const void* window,...);
这就是之前解决(或未解决)问题的方式:
long lhwnd = ((sun.awt.windows.WComponentPeer)._canvasPictureBox.getPeer()).getHWnd();
Pointer HWndPtr = new Pointer(lhwnd );
JNA 提供了一个方法来获取组件的本地对等体,Native.getComponentPointer()
,您可以使用该方法从 JNA 的 platform.jar
中初始化一个 HANDLE
对象或直接传入。
为了解释问题我想最好解释(简化)我想做的事情。
有一个设备(相机)。此设备的 API 由本机 DLL 提供。此 DLL 中的一个函数需要一个本机 Window 句柄来直接在应用程序中绘制捕获的图像。 C# 的解决方案是将 PictureBox.Handle
传递给此函数。但是在 Java 中,绘图组件是 awt.Canvas
。此问题的较早实现是获得此 Canvas 的对等方,自 JDK 1.1 以来已弃用。另外我不知道这个方法是否一直有效。因此他们是两个问题:
被弃用的方法真的有效吗?
是否有任何其他可能的解决方案来将 window 句柄传递给 DLL?
这是 DLL 内部函数的签名:
int draw_func(..., const void* window,...);
这就是之前解决(或未解决)问题的方式:
long lhwnd = ((sun.awt.windows.WComponentPeer)._canvasPictureBox.getPeer()).getHWnd();
Pointer HWndPtr = new Pointer(lhwnd );
JNA 提供了一个方法来获取组件的本地对等体,Native.getComponentPointer()
,您可以使用该方法从 JNA 的 platform.jar
中初始化一个 HANDLE
对象或直接传入。