我们有一个相当大的应用程序,用 C++ 编写,在 Windows Server 2003 和 Windows Server 2008 R2 上运行。它使用 GetOpenFileName API 来打开 Open File 对话框,用于选择视频文件。
我们看到在 Windows Server 2008 R2 上,我们偶尔会在“打开文件”对话框中遇到崩溃。主 GUI 线程正在等待工作线程,而工作线程正在获取访问冲突异常。堆栈跟踪如下所示:
linkinfo.dll!_IsValidLinkInfo@4()
shell32.dll!LinkInfo_LoadFromStream() + 0x7d bytes
shell32.dll!CShellLink::_LoadFromStream() + 0x14b bytes
shell32.dll!CShellLink::Initialize() + 0x1a bytes
shell32.dll!InitializeFileHandlerWithStream() + 0xc4 bytes
shell32.dll!CFileSysItemString::HandlerCreateInstance() + 0x13b bytes
shell32.dll!CFileSysItemString::LoadHandler() - 0x9f1d bytes
shell32.dll!CFSFolder::_CreatePerInstanceDefExtIcon() + 0x9b bytes
shell32.dll!CFSFolder::_CreateDefExtIcon() + 0xb6 bytes
shell32.dll!CFSFolder::s_GetExtractIcon() + 0x1e bytes
shell32.dll!CFSFolder::_BindHandler() - 0xd759 bytes
shell32.dll!CFSFolder::GetThumbnailHandler() + 0x51 bytes
shell32.dll!_CreateThumbnailHandler() + 0x61 bytes
shell32.dll!CShellItem::BindToHandler() - 0x20a93 bytes
shell32.dll!_GetExtractIconW@16() + 0x63 bytes
shell32.dll!_GetILIndexFromItem() + 0x5f bytes
shell32.dll!_SHGetIconIndexFromPIDL@20() - 0x3857d bytes
shell32.dll!CFSFolder::GetIconOf() + 0xa57c3 bytes
shell32.dll!_SHGetIconIndexFromPIDL@20() + 0x24 bytes
shell32.dll!_SHIconIndexFromPIDL@16() + 0x3d bytes
shell32.dll!CRegFolder::GetIconOf() + 0x10a892 bytes
shell32.dll!_SHGetIconIndexFromPIDL@20() + 0x24 bytes
shell32.dll!_SHIconIndexFromPIDL@16() + 0x3d bytes
explorerframe.dll!CNscIconTask::_Extract() + 0x1f bytes
explorerframe.dll!CNscOverlayTask::InternalResumeRT() + 0x31 bytes
explorerframe.dll!CRunnableTask::Run() + 0xa2 bytes
shell32.dll!CShellTask::TT_Run() + 0x5b bytes
shell32.dll!CShellTaskThread::ThreadProc() + 0x99 bytes
shell32.dll!CShellTaskThread::s_ThreadProc() + 0x1b bytes
shlwapi.dll!_ExecuteWorkItemThreadProc@4() + 0xe bytes
ntdll.dll!_RtlpTpWorkCallback@8() + 0xdf bytes
ntdll.dll!_TppWorkerThread@4() - 0x1185 bytes
kernel32.dll!@BaseThreadInitThunk@12() + 0x12 bytes
ntdll.dll!___RtlUserThreadStart@8() + 0x27 bytes
ntdll.dll!__RtlUserThreadStart@8() + 0x1b bytes
似乎许多其他人也遇到了类似的问题: MSDN thread from 2011。
“我的情况与打开通用对话框 (8R2) 应用程序崩溃的情况相同。有时它有助于重新启动应用程序并重试......有时不会。由于来自不同供应商的几个应用程序都会发生这种情况,因此更多可能是普通对话的问题。”
“我想在这里插话,我们在 2008 R2 机器上遇到了同样的问题。它可以是任何程序(我在 Notepad.exe 中见过一次)。当你查看事件查看器时,你会看到崩溃发生在由公共对话框调用的不同模块中。它发生在 32 位程序和 64 位程序中。它不会发生 100% 的时间——而是大约 50%。我们还没有看到任何模式何时以及为何发生。”
我们的假设是“打开文件”对话框试图从视频文件中获取一些缩略图信息,但视频解码器正在崩溃。
有没有其他人遇到过这个问题?如果是这样,您是否能够找出根本原因是什么?你知道为什么 IsValidLinkInfo 会出现访问冲突吗?
我们可以在这里应用任何解决方法吗?我们计划尝试删除此特定文件类型 (.ts) 的文件关联。有没有办法告诉“打开文件”对话框不要创建缩略图?