Java SWT没有更多的手柄,但应该有

Java SWT没有更多的手柄,但应该有,java,swt,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.ja

在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.
通过process explorer(MS sysiternals),我可以看到:

Handles 215
GDI Handles 48
USER Handles 23
根据这些信息,我认为这不是一个遗漏的问题

    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());
    }
有人知道我可以从哪里着手分析问题吗

谢谢

不幸的是,并非所有“不再有句柄”错误实际上都是由句柄的过度使用引起的。举个例子,看看我刚才报道的这个

在您的情况下,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
中所述


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

如果可能,请与我们分享问题的原因,以及可能的解决方案。我很好奇到底出了什么问题。我的意思是,当应用程序处于这种状态时,不仅工具提示不再起作用,而且不能打开新的对话框。因此,您可以在Control.createHandle行704中设置断点,检查句柄是否为0,然后在Expression视图中添加“org.eclipse.swt.internal.win32.OS.GetLastError()”,并查看结果为0。@keinfarbton您所拥有的只是上面链接的
CreateWindowEx
的MSDN规范。根据那里的注释,函数确实会返回NULL,并且仍然将last error设置为0。它们还列出了典型的错误原因。很抱歉,我的回答没有帮助。