DoModalで−1のエラー処理するには?

解決


SJ  2004-06-22 03:38:25  No: 53813

DoModalについて質問があります。
なにも実装せず
単にCDialog temp; temp.DoModalとし、
DoModalが−1を返した場合、システムエラーメッセージが表示されるのでしょうか?
それとも単に−1を返して、呼び出し側に制御が戻るのでしょうか?


RAPT  2004-06-22 10:19:39  No: 53814

やってみれば?


RiSK  2004-06-23 01:53:07  No: 53815

> やってみれば?
結果報告をよろしくお願いします

なんでも掲示板 1.0.1.5
http://kerochan.no-ip.com/vcsdk/bbs/view.php?id=3826


SJ  2004-06-23 01:58:54  No: 53816

どうやってDoModalがダイアログの作成に失敗してー1を
返すという状況を作ることができるのですか?


瀬戸っぷ  2004-06-23 02:26:47  No: 53817

> どうやってDoModalがダイアログの作成に失敗してー1を
> 返すという状況を作ることができるのですか?

最初に書かれている通り、
  CDialog temp;
  temp.DoModal();
とするだけですが…
戻り値受け取る為に
  CDialog temp;
  int i;
  i = temp.DoModal();
とかするかも知れませんが。
てきと〜にダイアログベースなMFCプロジェクト作って、
ボタン追加してそのボタンのハンドラに記述してみた。

結果は…自分で試して下さい。

VC++に関する質問・回答BBS
http://www.net24.ne.jp/~kenji/bbs/wforum.cgi?mode=allread&no=942&page=0


SJ  2004-06-23 03:55:47  No: 53818

すいません、説明が足りませんでした。
私が検証したいのはー1が返ってくる状況です。
単にint i = dlg.DoModal()とすればdlgの中で実装
してあるEndDialogの返り値のIDOKやID何とかが返って
くると思います。私が知りたいのは自分で-1を返す
実装をしない限り-1は返ってこないのか、それとも
何かシステムに問題が起こり、デフォルト実装で-1を
返すケースがあるのか、そしてそのときアプリケーション
に制御が正常に戻ってくるのかを知りたいのです。


瀬戸っぷ  2004-06-23 04:27:13  No: 53819

> 私が知りたいのは自分で-1を返す実装をしない限り-1は返ってこないのか、
> それとも何かシステムに問題が起こり、デフォルト実装で-1を返すケースがあるのか、
> そしてそのときアプリケーションに制御が正常に戻ってくるのかを知りたいのです。

MFCのソースを確認した方がよろしいかと思いますが。
CDialog::DoModal()
はC:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC\DLGCORE.CPP内にあります。(VC++6の場合)
軽く目を通した限りでは…
・ダイアログリソースが取れない時
・ダイアログ作成時に例外が発生した時(作成に関してイロイロ処理しているようですが)
に-1が返るようです。

最初のCDialog temp; temp.DoModal();をReleaseビルドで実行してもアプリ自体が落ちないようなので、
「試した範囲では」制御が戻ってきていると考えてよろしいかと。

# ナニもしていないに等しいので「試した範囲では」はほとんどアテにならんでしょうけど。
# MFC使いではないのでコレ以上は不明です。


SJ  2004-06-23 20:54:52  No: 53820

ありがとうございます。後はソースを追って自分で検証します。


BellWood  2004-06-23 23:25:28  No: 53821

画面に貼り付けた OCX が実行環境下に無かった場合か何かで
(すみません、はっきり覚えていない…)
DoModal() が -1 を返したことがありました。
当然のことながら、デバッグ環境下では起こすことはできません。
このときは、モジュールが大きかったせいか、メモリが不足気味だったせいか、
システムエラーは発生しませんでした。


瀬戸っぷ  2004-06-23 23:54:52  No: 53822

> そういうパターン画面に貼り付けた OCX が実行環境下に無かった場合か何かで
> (すみません、はっきり覚えていない…)
> DoModal() が -1 を返したことがありました。

そういうパターンですと…
InitCommonControlsEx()が必要なコントロールが貼り付けてあるダイアログで、
InitCommonControlsEx()を実行していなかった場合。
というのもありますかね?

# SDKで1時間近く悩んだことがある(^_^;)


SJ  2004-06-24 00:11:02  No: 53823

// return -1 in case of failure to load the dialog template resource
if (lpDialogTemplate == NULL)
    return -1;

CATCH_ALL(e)
{
    DELETE_EXCEPTION(e);
    m_nModalResult = -1;
}

瀬戸っぷさんの言うとおりでした。もしかしたらシステムエラー
が起こるケースも他にあるかもしれませんが、とりあえず−1が
帰ってきた場合にエラーメッセージを出すか出さないかで悩んで
いたので、ソースを見る限りはエラーメッセージを出したほうが
いいという結論を得ました。  皆さんご協力ありがとうございました。


瀬戸っぷ  2004-06-24 07:36:01  No: 53824

解決…ですか?
他は放置ですか??


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

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






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