ダイアログを終了させてもハンドルが1つ増加したまま。。。
VC++のMFCを使ってダイアログベースのEXEを造っています。
ハンドルのリークが発生し、困っています。
<動作内容>
メインのダイアログで、ボタン押下により別のダイアログを表示します。
DoModal()でモーダルダイアログを作成します。
別のプロセスからブロードキャストされるメッセージを処理したいため、
ボタン押下のルーチンで DoModal() せずに、スレッドを作成し、
そのスレッドで DoModal() を実行しています。
スレッド作成は AfxBeginThread() を使用しています。
<サンプルソース>
●メインダイアログ
// ボタン押下のルーチン
void CTestModalDlg::OnButton1()
{
AfxBeginThread( TestDlgThread, (LPVOID)this,
THREAD_PRIORITY_NORMAL );
}
// スレッド
static UINT TestDlgThread(LPVOID pThis)
{
CTestDlg1 Dlg;
Dlg.DoModal();
}
●DoModal() で表示されるダイアログ
何も手を加えてない、デフォルトのまま。
<結果>
DoModal() で表示されたダイアログを CDialog::OnCancel() で終了させ、
メインのスレッドが終了しても、ハンドルカウントが1つ増加しています。
Sleep() を入れて値をみてみると、
・スレッド作成:2増加
・DoModal() でダイアログ表示:1増加
・OnCancel() で終了:増減なし
・スレッド終了:2減少
=>結果、1増加となっていました。
以下のパターンでは問題ありませんでした。
・スレッドを作成+終了(ダイアログ表示しない)
・スレッドを作成せずに、ボタン押下ルーチンから
DoModal() でダイアログ表示+終了
ということで、AfxBeginThread()、DoModal() 自体は問題ないのですが、
スレッドを作成して DoModal() するとリークが発生します。
識者の方、原因、対策など、ご教授願います。
お礼
RealPlayerをアンインストールして入れ直したところ解決しました。アドバイスありがとうございました。