Общие диалоги в Windows Server 2008 R2: сбой в GetOpenFileName

У нас есть масштабное приложение, написанное на C ++, работающее на Windows Server 2003 и Windows Server 2008 R2. Он использует API GetOpenFileName для вызова диалогового окна «Открыть файл» для выбора видеофайла.

Мы видим, что в Windows Server 2008 R2 мы иногда получаем сбой в диалоговом окне «Открыть файл». Основной поток графического интерфейса ожидает рабочий поток, а рабочий поток получает исключение нарушения прав доступа. Трассировка стека выглядит так:

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 от 2011 г..

У меня такая же ситуация, что при открытии общего диалога (8R2) приложение вылетает. Иногда помогает перезапустить приложение и попробовать еще раз ... иногда нет. Поскольку это происходит для пары приложений от разных производителей, скорее всего, это проблема общего диалога.

Я хочу сообщить, что мы испытываем ту же проблему с машиной 2008 R2. Это может быть любая программа (я видел ее однажды в Notepad.exe). Когда вы смотрите на средство просмотра событий, вы видите, что сбой происходит в разных модулях, которые вызываются общим диалоговым окном. Это бывает в 32-битных программах и в 64-битных. Это происходит не в 100% случаев, а примерно в 50% случаев. Мы не видели никаких закономерностей, когда и почему это происходит.

Наша гипотеза состоит в том, что диалоговое окно «Открыть файл» пытается получить некоторую информацию об эскизах из видеофайла, но при этом происходит сбой видеодекодера.

Кто-нибудь еще сталкивался с этой проблемой? Если да, то смогли ли вы выяснить, в чем заключалась основная причина? Вы знаете что-нибудь о том, почему IsValidLinkInfo может получить нарушение прав доступа?

Есть ли какие-то обходные пути, которые мы могли бы применить здесь? Мы планируем попробовать удалить файловую ассоциацию для этого конкретного типа файлов (.ts). Есть ли способ запретить диалоговому окну открытия файла создавать эскизы?


person russilwvong    schedule 26.09.2012    source источник


Ответы (1)


Обновлять:

Мы обнаружили другую ветку на ServerFault, сообщающую об аналогичной проблеме. («Обычно происходит сбой при нажатии« Файл / Открыть »или« Файл / Сохранить, но не каждый раз »). Другой пользователь (PG) смог решить проблему, исключив приложение из Data Execution Prevention по рекомендации Microsoft.

Мы проверили параметр «Предотвращение выполнения данных» и обнаружили, что он установлен на «Включить DEP для всех программ и служб, кроме выбранных мной». После изменения этого параметра на «Включить DEP только для основных программ и служб Windows» проблема больше не возникает.

person russilwvong    schedule 07.01.2013