0

我最近遇到了我的 Eclipse SWT GUI 应用程序的问题。我试图使用以下代码获取窗口句柄:

Display.getDefault().syncExec(()->{
            handle = Display.getDefault().getActiveShell().handle;
        });

在我的 64 位 Windows 10 操作系统上完美运行。

然后,当我在 32 位 Windows 机器(我使用 Hyper-v 在我的电脑上设置的 VM)上部署相同的应用程序时,我收到以下奇怪的错误:

java.lang.NoSuchFieldError: handle

此句柄的文档说:

长 org.eclipse.swt.widgets.Control.handle

操作系统资源的句柄(警告:此字段取决于平台)

重要提示:此字段不是 SWTpublic API 的一部分。它仅被标记为公共,以便它可以在 SWT 提供的包中共享。它并非在所有平台上都可用,并且永远不应该从应用程序代码中访问。

这可能是导致此问题的原因吗?

如果我们不能使用这个属性,还有什么替代方法?我知道 JNI / JNA 处理本机代码,据我所知,它们仍然依赖 SWT 实现来获取句柄。

感谢您花时间回答我的问题!

干杯!

4

1 回答 1

1

我原以为 Javadoc 让情况变得非常清楚。不应使用 SWT 内部,它们在每个平台上完全不同(可能包括同一操作系统上的 32/64 位版本),它们甚至可能在不同版本之间发生变化。

32 位版本的 Windows SWT 确实有一个handle字段,但在 64 位版本中它是一个int而不是一个long- 这就是给你这个错误的原因。其他平台的 SWT 根本没有handle字段。

如果你真的必须访问这样的东西,你将不得不编写特定于每个平台/窗口系统/体系结构的代码。对于 Eclipse 插件,这可以通过特定于平台的片段来完成。我想对于这种特殊情况,您还可以使用反射来查找 int 和 long 'handle' 字段。

另请注意,当前版本的 Eclipse 根本不再支持 32 位。

于 2020-02-10T08:17:35.067 回答