10

Windows 10 で正常に動作する Windows デスクトップ アプリケーション (v120_xp プラットフォーム ツールセットを使用して Visual C++ 2013 でビルド) を公開しましたが、「しきい値 2」更新プログラムをインストールしたユーザーから、アプリが失敗したという報告を受け取り始めました。次のエラー メッセージが表示されます。

アプリケーションを正しく起動できませんでした (0xc0000142)。[OK] をクリックして、アプリケーションを閉じます。

エラー コードは STATUS_DLL_INIT_FAILED であるため、おそらく初期化に失敗した DLL を探しています。

デバッガーでアプリケーションの起動を観察し、プロセス モニターを使用して読み込まれている DLL を確認することで、この問題のトラブルシューティングを試みました。(Threshold 2 がインストールされたマシンで) 最後にロードされた DLL は「davhlpr.dll」です。しきい値 2 のない Windows 10 でアプリケーションが起動するのを見ると、明らかにその DLL をまったくロードせずに起動します。これは、問題が davhlpr.dll に関係している可能性があることを示唆していますが、私たちのコードはその DLL に明示的に依存しておらず、それが何であるかはわかりません。

他の誰かがこのようなものを見たことがありますか?

これをトラブルシューティングする方法について何か考えがある人はいますか? デバッガーと Process Monitor を試した後、アイデアがありません。

4

2 に答える 2

8

私たちは最終的にこれの底にたどり着きました。私たちが取ったアプローチは次のとおりです。

  1. アプリケーションが依存するすべての DLL を遅延ロードするようにリンカーに指示します (アプリケーションの開始後まで初期化の問題を延期します)。
  2. comdlg32.dll が読み込まれて [開く] ダイアログが表示されるまで、アプリケーションが壊れるまで実行します。
  3. comdlg32.dll を使用して [開く] ダイアログを表示するだけの簡単なテスト プログラムを作成します。
  4. Windows 10 ビルド 15086 でテスト プログラムを実行し、どの DLL が読み込まれるかを観察します。これを、アプリの遅延読み込みバージョンで [開く] ダイアログをトリガーしたときに読み込まれる DLL と比較します。

簡単に言うと、失敗は、何らかの理由で comdlg32.dll がロードしようとしていた "fwbase.dll" (明らかに Windows ファイアウォールの一部) と呼ばれる Windows コンポーネントが原因であることが判明しました。私たちのアプリケーションには、「fwBase.dll」という名前のコンポーネント (AMD Framewave ライブラリの一部) が含まれていましたが、Windows ローダーは、fwbase.dll が既に読み込まれていると認識していたため、わざわざ fwbase.dll を読み込もうとしなかったと思われます。その後まもなく大惨事が続きました。

現時点では、これが Windows のバグなのか何なのかわかりませんが、fwBase.dll の名前を変更することで解決しました。

于 2015-12-01T18:41:25.100 に答える