WindowsServer2003およびWindowsServer2008 R2で実行される、C++で記述されたかなり大きなアプリケーションがあります。GetOpenFileName APIを使用して、ビデオファイルを選択するための[ファイルを開く]ダイアログを表示します。
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
他の多くの人々が同様の問題に遭遇したようです: 2011年のMSDNスレッド。
「共通ダイアログ(8R2)を開くと、アプリケーションがクラッシュするのと同じ状況です。アプリケーションを再起動して再試行すると役立つ場合があります。そうでない場合もあります。これは、さまざまなベンダーのいくつかのアプリケーションで発生するため、それ以上のことです。おそらく一般的なダイアログの問題です。」
「2008R2マシンでも同じ問題が発生していることをここでチャイムしたいと思います。どのプログラムでもかまいません(Notepad.exeで一度見たことがあります)。イベントビューアを見ると、次のことがわかります。クラッシュは、共通のダイアログによって呼び出されるさまざまなモジュールで発生します。32ビットプログラムと64ビットで発生します。100%の確率で発生するのではなく、約50%の確率で発生します。いつ、なぜそれが起こるのか。」
私たちの仮説は、[ファイルを開く]ダイアログがビデオファイルからサムネイル情報を取得しようとしているが、ビデオデコーダーがクラッシュしているというものです。
他の誰かがこの問題に遭遇しましたか?もしそうなら、あなたは根本的な原因が何であったかを知ることができましたか?IsValidLinkInfoがアクセス違反を取得する理由について何か知っていますか?
ここで適用できる回避策はありますか?この特定のファイルタイプ(.ts)のファイルの関連付けを削除してみる予定です。[ファイルを開く]ダイアログにサムネイルを作成しないように指示する方法はありますか?