1

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)のファイルの関連付けを削除してみる予定です。[ファイルを開く]ダイアログにサムネイルを作成しないように指示する方法はありますか?

4

1 に答える 1

0

アップデート:

同様の問題を報告しているServerFault の別のスレッドを見つけました (「通常、[ファイル]/[開く] または [ファイル]/[保存] をクリックするとクラッシュしますが、毎回ではありません」)。別のユーザー (PG) は、Microsoft の推奨に従って、アプリケーションをデータ実行防止から除外することで問題を解決することができました。

データ実行防止の設定を確認したところ、「選択したものを除くすべてのプログラムとサービスに対して DEP を有効にする」に設定されていることがわかりました。「重要な Windows プログラムとサービスに対してのみ DEP を有効にする」に変更すると、問題は発生しなくなりました。

于 2013-01-07T18:52:48.033 に答える