2012-03-14 93 views
5

MSDNは、CDialog.DoModal()関数の場合、関数がダイアログボックスを作成できなかった場合、戻り値は-1となります。どちらの場合でもダイアログボックスの作成に失敗する可能性があります。CDialog.DoModal()関数がダイアログボックスの作成に失敗したとき?

(LPCDLGTEMPLATE)LockResource(hDialogTemplate)がNULLを返し、DoModal関数が-1を返す可能性があるかどうかをMFCソースコードを簡単に調べます。

私の問題は、私たちのストレステストで安定して再生することができないので、私は、根本的な原因を見つけるためのプログラムをデバッグすることはできません。誰もここで似たような問題を抱えていましたか

+3

あなたは_had_ MFCを使用していますか? – ApprenticeHacker

+1

GetLastErrorとは何ですか? –

+0

@IntermediateHacker、これを「そのAPIがうんざりして、どうしてそれを使うのか」という議論に変えてみましょう。私たちは一日中ここにいます。 –

答えて

4

DoModal()CreateDialogIndirect() APIの機能に依存しています。そのいとこのドキュメントその機能は、以下の状況下で失敗する可能性がDialogBox()状態:

  • 無効なパラメータ値、
  • システムクラスが別のモジュールによって登録された、
  • WH_CBTフックがインストールされていますそして、ダイアログテンプレートで故障コード、コントロールの
  • 1を返すが登録されていない、またはそのウィンドウプロシージャはWM_CREATEまたはWM_NCCREATEに失敗しました。

は、私は個人的には最初の三つの理由が発生したことはありませんが、私のダイアログボックスがマシンに登録されていないActiveXコントロールが含まれているため、私は、第四により、一度噛まれました。同じ問題が発生している可能性があります。

+0

MFCは 'DialogBox'を使用しません。他の呼び出しと同様にシミュレートします。この回答の情報のいくつかはまだ有用です。 –

+0

@Mark、あなたは絶対に正しいです、それはモーダルダイアログのために 'CreateDialogIndirect()'を使い、モーダル状態そのものを実装します。理由は不思議ですが、おそらく良い理由があります。あなたの明確化のためにありがとう:) –

+1

私は、ロケールを変更した後にDoModal呼び出しが失敗しました。新しいリソースは、元のリソースが持っていたいくつかのidsを逃しました。私はこれと同様の問題で他人にヒントを与えることを望んでいると報告しています。 – Zac

0

枯渇したGDIオブジェクトの根本的な原因がわかりました。私たちのソフトウェアにはハンドルリークがあります。 GDIオブジェクトの最大数はレジストリで設定できます。値はWindows XPでは16000です。私はたくさんのUIコントロールを作成し、それらを解放しないというプログラムを書いた。このようにして、私はGDIの処理状況をシミュレートできます。その結果、同じ問題が再現されます。

HKEY_LOCAL_MACHINE \ソフトウェア\マイクロソフト\ Windows NTの\ CurrentVersionの\ WINDOWS \ GDIProcessHandleQuota

参考:http://msdn.microsoft.com/en-us/library/windows/desktop/ms724291%28v=vs.85%29.aspx

だから、なのCDialogなど、いくつかのUIコントロール、GDIオブジェクトが枯渇していることを最終的な結論であります作成に失敗するでしょうか?

+0

複雑なGUI(CAD、EDA)を使用してアプリケーションを実行/デバッグするときに、排気を処理することはよく知られている問題です。 Win64では、Out of Handlesの問題は予期していませんでした。 – BlackBada