将本机 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 以来已弃用。另外我不知道这个方法是否一直有效。因此他们是两个问题:

  1. 被弃用的方法真的有效吗?

  2. 是否有任何其他可能的解决方案来将 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 对象或直接传入。