モーダルダイアログを表示するDLLでの不具合

解決


小梅  2004-06-08 01:15:31  No: 53762

モーダルダイアログを表示するレギュラーDLLを作成し、
1つのプロセスから上記DLLの表示用APIを複数回呼び
出すと(タイマーで順々に)、新しく呼んだ順からダイ
アログを閉じていかないと、呼び元に処理が戻ってき
ません。(DoModalから戻ってこない)
回避方法をご存知の方がいらっしゃいましたら、是非
ご教示いただきたいと思います。
---DLL側コード---
__declspec(dllexport) int ShowDlg(HWND hWnd)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    CWnd *pWnd=NULL;
    pWnd = CWnd::FromHandle(hWnd);
    CTestDialog dlg(pWnd);
    return dlg.DoModal();
}
---EXE側コード---
__declspec(dllexport) int ShowDlg(HWND hWnd);
void CDLGEXEDlg::OnTimer(UINT nIDEvent) 
{
    int nRes=ShowDlg(this->m_hWnd);
    AfxMessageBox("キタ!");
   
    CDialog::OnTimer(nIDEvent);
}


tetrapod  2004-06-08 01:54:55  No: 53763

それってあたりまえなんぢゃ。
DoModal() ってダイアログを閉じるまで帰ってこない関数でっせ。


小梅  2004-06-08 02:06:22  No: 53764

早速のレスありがとうございます。
すいません。説明が足りませんでした。
表示されるダイアログ側ではボタン押下でCDialog::OnOK()が処理されるようになっていますが、DoModal()から処理が戻りません。
新しく表示された順にダイアログのボタンを押して閉じていけば、都度DoModal() から処理が戻りますが、順序を間違えるとあるタイミングで一気に処理が戻ってくる挙動になります。


tetrapod  2004-06-08 02:11:23  No: 53765

いやだからそれも当たり前というか。
OnTimer() が再帰的に呼ばれてるんだから。
新しいダイアログを最初に閉じれば OnTimer() の再帰順になるし、
古いダイアログを最初に閉じれば再帰順が崩れることになるし。


小梅  2004-06-08 02:20:12  No: 53766

なるほどです。ありがとうございます。

これを回避するにはモードレスにするしかないですかね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加