在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
根据这些信息,我认为不是一个缺失的处置问题。
有没有人知道我可以在哪里继续分析问题?
谢谢!
答案 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()
值时,将一个(条件)断点停止。