2

我们的一些 Windows 用户在启动我们的应用程序后不久就会得到这个堆栈跟踪:

java.lang.InternalError: Could not bind shell folder to interface
  at sun.awt.shell.Win32ShellFolder2.initSpecial(Native Method) ~[na:1.7.0_25]
  at sun.awt.shell.Win32ShellFolder2.access$300(Unknown Source) ~[na:1.7.0_25]
  at sun.awt.shell.Win32ShellFolder2$1.call(Unknown Source) ~[na:1.7.0_25]
  at sun.awt.shell.Win32ShellFolder2$1.call(Unknown Source) ~[na:1.7.0_25]
  at sun.awt.shell.Win32ShellFolderManager2$ComInvoker.invoke(Unknown Source) ~[na:1.7.0_25]
  at sun.awt.shell.ShellFolder.invoke(Unknown Source) ~[na:1.7.0_25]
  at sun.awt.shell.Win32ShellFolder2.<init>(Unknown Source) ~[na:1.7.0_25]
  at sun.awt.shell.Win32ShellFolderManager2.getNetwork(Unknown Source) ~[na:1.7.0_25]
  at sun.awt.shell.Win32ShellFolder2.getFileSystemPath(Unknown Source) ~[na:1.7.0_25]
  at sun.awt.shell.Win32ShellFolder2.access$400(Unknown Source) ~[na:1.7.0_25]
  at sun.awt.shell.Win32ShellFolder2$10.call(Unknown Source) ~[na:1.7.0_25]
  at sun.awt.shell.Win32ShellFolder2$10.call(Unknown Source) ~[na:1.7.0_25]
  at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) ~[na:1.7.0_25]
  at java.util.concurrent.FutureTask.run(Unknown Source) ~[na:1.7.0_25]
  at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) ~[na:1.7.0_25]
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ~[na:1.7.0_25]
  at sun.awt.shell.Win32ShellFolderManager2$ComInvoker$3.run(Unknown Source) ~[na:1.7.0_25]
  at java.lang.Thread.run(Unknown Source) ~[na:1.7.0_25]

观察:

  • 堆栈跟踪中的每一帧都在 JDK 中,而不是在我们的代码中。
  • 这仅在 Windows 上发生,但我们在 Vista 和 Windows 7 上都有过报告。
  • 各种版本的 Java 都会发生这种情况:1.6.0_19、1.6.0_21、1.7.0_11、1.7.0_25。
  • 这个问题只发生在我们的少数用户身上,但对于这些用户来说是 100% 可重复的。不幸的是,除了显示此问题外,我们无法看到这些用户系统的任何共同点,而且我们的开发人员也没有亲身经历过。
  • 我对 Oracle 的错误数据库的搜索没有发现具有相同或相似堆栈跟踪的错误。
  • 网上似乎有很多关于这个特定问题的帖子,但没有人知道是什么原因造成的。

我不希望 Oracle 解决任何问题,如果它确实是一个 JDK 错误——但如果我们知道是什么触发了这个错误,我们至少可以帮助受它折磨的用户。任何人都可以阐明导致这种情况发生的原因吗?

编辑:相关的本机功能是这个,来自ShellFolder2.cpp

JNIEXPORT void JNICALL Java_sun_awt_shell_Win32ShellFolder2_initSpecial
    (JNIEnv* env, jobject folder, jlong desktopIShellFolder, jint folderType)
{
    // Get desktop IShellFolder interface
    IShellFolder* pDesktop = (IShellFolder*)desktopIShellFolder;
    if (pDesktop == NULL) {
        JNU_ThrowInternalError(env, "Desktop shell folder missing");
        return;
    }
    // Get special folder relative PIDL
    LPITEMIDLIST relPIDL;
    HRESULT res = fn_SHGetSpecialFolderLocation(NULL, folderType,
        &relPIDL);
    if (res != S_OK) {
        JNU_ThrowIOException(env, "Could not get shell folder ID list");
        return;
    }
    // Set field ID for relative PIDL
    env->CallVoidMethod(folder, MID_relativePIDL, (jlong)relPIDL);
    // Get special folder IShellFolder interface
    IShellFolder* pFolder;
    res = pDesktop->BindToObject(relPIDL, NULL, IID_IShellFolder,
        (void**)&pFolder);
    if (res != S_OK) {
        JNU_ThrowInternalError(env,
            "Could not bind shell folder to interface");
        return;
    }
    // Set field ID for pIShellFolder
    env->CallVoidMethod(folder, MID_pIShellFolder, (jlong)pFolder);
}

为了达到“无法绑定”异常,它看起来像pDesktop != NULL并且relPIDL被成功检索,但pDesktop->BindToObject()返回的东西不是S_OK. pDesktop是一个IShellFolder*,这显然是在 Windows 的<shellapi.h>. 更糟糕的是,Java 会丢弃IShellFolder::BindToObject.

所以,我想这个问题可以归结为:什么会导致IShellFolder::BindToObject失败?

编辑 2:由于在Win32ShellFolderManager2.java:181Win32ShellFolderManager2.getNetwork()调用Win32ShellFolder2ctor ,我们可以看到最后一个参数must 是。那么,用户的网上邻居文件夹是否有问题?Win32ShellFolder2.initSpecialWin32ShellFolder2.NETWORK

4

2 回答 2

2

好吧,有几份报告与您的报告相似(例如来自 jEdit的这份报告,这份来自代号的报告 ,以及这份来自德文的报告 - 这似乎是一个JFileChooser错误,在 Windows 7 和 Java 6 中的堆栈跟踪非常接近您的报告)。所有似乎都以JFileChooser一种或另一种方式与和/或文件浏览有关。

所以我会以两种方式之一来解决这个问题:

要么走耗时/非推测的道路,并使用jstackVisualVMJConsole等工具转储受影响的安装,直到您能够隔离问题的根本原因(可能是也可能不是JFileChooser)。如果您选择该路径,请记住,必须远程访问受影响的安装之一或获得精通技术的用户的帮助。

或者尝试走捷径,假设问题确实是JFileChooser(如轶事证据所示)并发布自定义版本JFileChooser替换FileDialog。如果它在受影响的机器上按预期运行,则案例已关闭;否则,请轻点自己的后背,尝试走“漫长而曲折的道路”。

于 2013-07-15T00:36:51.973 回答
0

有同样的问题,答案是 java.awt.FileDialog

如果您查找“打开文件对话框”的 VbScript 解决方案,似乎没有 COM 类在大多数 Windows 平台上完成这项工作

于 2018-03-03T10:16:34.513 回答