Java 是什么导致sun.awt.shell.Win32ShellFolder2.initSpecial()抛出内部错误?
我们的一些Windows用户在启动我们的应用程序后不久就获得了此堆栈跟踪: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
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);
}