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

解決


SJ  2004-06-22 03:38:25  No: 53813  IP: [192.*.*.*]

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

編集    削除
RAPT  2004-06-22 10:19:39  No: 53814  IP: [192.*.*.*]

やってみれば?

編集    削除
RiSK  2004-06-23 01:53:07  No: 53815  IP: [192.*.*.*]

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

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

編集    削除
SJ  2004-06-23 01:58:54  No: 53816  IP: [192.*.*.*]

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

編集    削除
瀬戸っぷ  2004-06-23 02:26:47  No: 53817  IP: [192.*.*.*]

> どうやって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  IP: [192.*.*.*]

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

編集    削除
瀬戸っぷ  2004-06-23 04:27:13  No: 53819  IP: [192.*.*.*]

> 私が知りたいのは自分で-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  IP: [192.*.*.*]

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

編集    削除
BellWood  2004-06-23 23:25:28  No: 53821  IP: [192.*.*.*]

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

編集    削除
瀬戸っぷ  2004-06-23 23:54:52  No: 53822  IP: [192.*.*.*]

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

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

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

編集    削除
SJ  2004-06-24 00:11:02  No: 53823  IP: [192.*.*.*]

// 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  IP: [192.*.*.*]

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

編集    削除