2

在 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 工具来跟踪资源是否存在泄漏。那没有。偷偷告诉有

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

使用流程资源管理器(MS sysiternals)我看到了这个:

Handles 215
GDI Handles 48
USER Handles 23

从这些信息来看,我认为这不是一个丢失的处置问题。

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

谢谢!

4

1 回答 1

2

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

在您的情况下, 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()值。

于 2013-11-13T07:35:12.437 回答