モーダルダイアログを表示するレギュラー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);
}
それってあたりまえなんぢゃ。
DoModal() ってダイアログを閉じるまで帰ってこない関数でっせ。
早速のレスありがとうございます。
すいません。説明が足りませんでした。
表示されるダイアログ側ではボタン押下でCDialog::OnOK()が処理されるようになっていますが、DoModal()から処理が戻りません。
新しく表示された順にダイアログのボタンを押して閉じていけば、都度DoModal() から処理が戻りますが、順序を間違えるとあるタイミングで一気に処理が戻ってくる挙動になります。
いやだからそれも当たり前というか。
OnTimer() が再帰的に呼ばれてるんだから。
新しいダイアログを最初に閉じれば OnTimer() の再帰順になるし、
古いダイアログを最初に閉じれば再帰順が崩れることになるし。
なるほどです。ありがとうございます。
これを回避するにはモードレスにするしかないですかね。
ツイート | ![]() |