Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是什么导致sun.awt.shell.Win32ShellFolder2.initSpecial()抛出内部错误?_Java_Windows_Winapi - Fatal编程技术网

Java 是什么导致sun.awt.shell.Win32ShellFolder2.initSpecial()抛出内部错误?

Java 是什么导致sun.awt.shell.Win32ShellFolder2.initSpecial()抛出内部错误?,java,windows,winapi,Java,Windows,Winapi,我们的一些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) ~[n

我们的一些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]
为了达到“无法绑定”异常,它看起来像
pDesktop!=NULL
relPIDL
已成功检索,但
pDesktop->BindToObject()
返回的内容不是
S_OK
pDesktop
是一个,显然是在Windows的
中定义的。更糟糕的是,Java丢弃了由返回的错误代码

因此,我想问题可以归结为:什么会导致
IShellFolder::BindToObject
失败


编辑2:由于
win32shellfoldermanager.getNetwork()
是调用
Win32ShellFolder2
的构造函数,我们可以看到
Win32ShellFolder2.initSpecial
的最后一个参数必须是
Win32ShellFolder2.NETWORK
。那么,用户的“网络邻居”文件夹可能有问题吗?

好吧,有几个报告与您的报告类似(比如,在德语中,它看起来像是一个
JFileChooser
bug,在Windows 7和Java 6中的堆栈跟踪与您的非常接近)。所有这些似乎都与
JFileChooser
和/或以某种方式浏览文件有关

因此,我将采用以下两种方法之一:

选择耗时/非推测性的方法,使用工具(例如)转储受影响的安装,或者直到您能够找出问题的根本原因(可能是也可能不是
JFileChooser
)。如果选择该路径,请记住,必须远程访问某个受影响的安装或获得技术熟练用户的帮助


或者尝试走捷径,假设问题确实出在
JFileChooser
(如传闻证据所示),然后发布一个自定义版本,将
JFileChooser
替换为。如果在受影响的机器上按预期运行,则外壳关闭;如果你想尝试走“漫长而曲折的道路”,那就给自己一点鼓励吧。

也有同样的问题,答案是


如果您查找“打开文件对话框”的VbScript解决方案,似乎没有COM类为大多数windows平台执行此任务

在崩溃时,您的程序是否处理
JFileChooser
?看一看。还可以尝试在受影响的安装中以管理员身份运行您的应用程序。我们确实使用了
JFileChooser
,但用户在执行任何操作之前已报告发生了这种情况。在异常发生时,
JFileChooser
可能已经或正在构建中,但由于异常发生在不同的线程上,我们无法判断。(我在2010年看到了您在搜索这个问题时提到的bug——堆栈跟踪与我们的有很大不同,并且为解决方案指定的属性在Java 6或Java 7中不存在。)您找到了问题的根源吗?不,从来没有。我仍然想知道答案。(事实上,我想让Oracle修复这个bug…)
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);
}