SWT不再处理,但应该有

时间:2013-11-13 06:00:42

标签: java swt

在Eclipse RCP应用程序中,我得到了例外:

org.eclipse.swt.SWTError: No more handles
at org.eclipse.swt.SWT.error(SWT.java:4423)
at org.eclipse.swt.SWT.error(SWT.java:4312)
at org.eclipse.swt.SWT.error(SWT.java:4283)
at org.eclipse.swt.widgets.Widget.error(Widget.java:472)
at org.eclipse.swt.widgets.Shell.createToolTipHandle(Shell.java:660)
at org.eclipse.swt.widgets.Shell.toolTipHandle(Shell.java:1944)
...

我添加了Sleak工具来跟踪资源是否有泄漏。 那没有。 Sleak说有

63 Colors, 5 Cursors, 4 Fonts, 75 Images.

使用进程资源管理器(MS sysiternals),我看到了:

Handles 215
GDI Handles 48
USER Handles 23

根据这些信息,我认为是一个缺失的处置问题。

有没有人知道我可以在哪里继续分析问题?

谢谢!

1 个答案:

答案 0 :(得分:2)

不幸的是,并非所有“不再处理”错误实际上都是由过度消耗句柄引起的。例如,请参阅我之前报道过的SWT bug

在您的情况下,CreateWindowEx返回NULL。由于我无法重现问题,我不知道下面的代码是否有效,但我希望它能够正常工作。如果没有,将其转换为C并以本机方法调用它。我不知道SWT中的任何其他内部代码是否重置了最后一个错误。当您得到GetLastError()的结果时,请转到下一步来解决问题。

    int toolTipHandle = OS.CreateWindowEx (0, new TCHAR(0, OS.TOOLTIPS_CLASS, true), null,
                    OS.TTS_ALWAYSTIP | OS.TTS_NOPREFIX, OS.CW_USEDEFAULT, 0, OS.CW_USEDEFAULT, 0, shell.handle, 0,
                    OS.GetModuleHandle(null), null);
    if (toolTipHandle == 0) {
        System.out.println(OS.GetLastError());
    }

由于这是一个工具提示创建,我建议您为控件设置工具提示null,并在SWT.MouseHover事件中调用此代码。


修改:我们的想法是调用GetLastError()功能,如CreateWindowEx MSDN page中所述。

更简单的方法是使用调试器:当CreateWindowEx在Shell:660返回0并且检查OS.GetLastError()值时,将一个(条件)断点停止。

相关问题