1

我们有一个相当大的应用程序,用 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) 的文件关联。有没有办法告诉“打开文件”对话框不要创建缩略图?

4

1 回答 1

0

更新:

我们在 ServerFault 上发现另一个线程报告了类似的问题(“通常当您单击文件/打开或文件/保存时它会崩溃,但并非每次都崩溃”)。根据 Microsoft 的建议,另一位用户 (PG) 能够通过将应用程序排除在数据执行保护之外来解决问题。

我们检查了数据执行保护设置,发现它设置为“为除我选择的程序和服务之外的所有程序和服务启用 DEP”。将其更改为“仅对基本的 Windows 程序和服务启用 DEP”后,问题不再出现。

于 2013-01-07T18:52:48.033 回答