1

MFC9 (VC2008) に対して構築されたアプリケーションがあります。アプリケーションは SDI アプリケーションであり、InitInstance() 中にファイルを開くダイアログを表示します。そのダイアログを表示すると、comdlg32.dll が読み込まれます。数分後、comdlg32.dll が自動的にアンロードされます。この後、DLL に依存する次の関数がクラッシュします。

どうすればこれを回避できますか? DLL の自動アンロード/ロードを制御するものは何ですか?

詳細情報:

  • 同じアプリケーションを使用する WinXP では、この問題は発生しません。
  • Win7 では、この動作は今年の初めから発生しただけです。MFC の更新がこれに関連している可能性がありますか?
  • 小さなテスト アプリケーションでは、問題のある動作は見られません。必要に応じて comdlg32.dll が再ロードされます。
  • MDI アプリケーション (http://support.microsoft.com/kb/173261) の InitInstance() でモーダル ダイアログを使用することは推奨されないという Microsoft の声明を見つけました。ただし、SDI アプリケーションはあります。
  • comdlg32.dll を直接使用することはなく、MFC を介して間接的にのみ使用します。
4

2 に答える 2

2

起動時にアプリケーションでInitCommonControlsExを呼び出す必要があります。これにより、comdlg32.dll が初期化され、dll の参照カウントも増加するため、ファイルを開く/保存ダイアログを閉じた後にアンロードされません。

于 2012-03-12T16:06:50.343 に答える
0

ダイアログをカスタマイズしたのか、それとも単純なファイル ダイアログなのかはわかりません。Vista から、共通ファイル ダイアログがいくつか変更されたと思います。古い MFC コードと新しい MFC コードを比較すると、それらの変更を利用するために MFC コードが変更されていることがわかります。たとえば、IFileDialogEvents と IFileDialogControlEvents は、Vista 以降のバージョンの OS がファイル ダイアログをカスタマイズする方法をサポートするために MFC に実装されました。

答えがあるかどうかはわかりませんが、ファイルダイアログを呼び出そうとする前に、InitInstance() でいつか AfxOleInitialize() を呼び出すようにします。

私が確実に試みるもう 1 つのこと (XP で動作するため) は、CFileDialog のコンストラクターで、bVistaStyle を FALSE に設定することです。これにより、m_bVistaStyle が XP での実行時に設定される FALSE に確実に設定されます。

于 2012-03-12T14:47:59.007 に答える