2012-03-12 15 views
1

MFC9(VC2008)に対してアプリケーションが構築されています。 アプリケーションはSDIアプリケーションで、InitInstance()中にファイルを開くダイアログを表示します。そのダイアログを表示すると、comdlg32.dllがロードされます。数分後、comdlg32.dllが自動的にアンロードされます。その後、DLLに依存する次の関数がクラッシュします。アンロードされたcomdlg32.dllによって引き起こされたMFC SDIアプリケーションのクラッシュを回避するにはどうすればよいですか?

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

さらに詳細:

  • 私たちは、同じアプリケーションでWinXPの上で、この問題は表示されません。
  • Win7では、この現象は今年の初めからのみ発生しました - 多分一部のMFCアップデートはこれに関連していますか?
  • 小さなテストアプリケーションでは問題が発生しません.comdlg32.dllは必要なときに再ロードされます。
  • MDIアプリケーション(http://support.microsoft.com/kb/173261)のInitInstance()でモーダルダイアログを使用することは推奨されていません.SDIアプリケーションがあり、しかし、。
  • comdlg32.dllを直接使用するのではなく、MFC経由でのみ間接的に使用します。

答えて

0

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

私は答えがあるのか​​分かりませんが、笑顔のために私はファイルダイアログを呼び出そうとする前に、いつかInitInstance()でAfxOleInitialize()を呼び出していることを確認しています。

私は確かに(XPの下で動作するので)あなたのCFileDialogのコンストラクタにあると確信している他のことは、FALSEにbVistaStyleを設定することを確認することです。これにより、m_bVistaStyleがFALSEに設定され、XPで実行されているときにFALSEに設定されます。

+0

いいえ、ファイルダイアログはカスタマイズされていません。 AfxOleInit()が存在します。 – stmoebius

+0

さて、少なくとも、bVistaStyleがFALSEに設定されていることを確認して、それが何らかの効果を持つかどうかを確認したいと思います。 –

2

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

+0

私たちは確かにInitCommonControlsExを持っていませんでした。しかし、それを追加しても問題は解決しませんでした。 DLLの参照カウントを分析する方法はありますか? – stmoebius

関連する問題