エラー処理の仕方 – プログラミング – Home

通知
すべてクリア

[解決済] エラー処理の仕方


ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

たびたびすみません
まだ下のダイアログを表示するDLLでキー入力が解決していませんが
宜しくお願いします

スタティックが6個、ボタンが2つのダイアログをSDKで作成しています。

それぞれのコントロールをMoveWindowで配置しているのですが、
ウィンドウハンドルを取得する為に

 hWnd = GetDlgItem(hDlgWnd, IDC_DELETE );

の様にしています。
そこで疑問なのがエラー処理の仕方です

コントロール毎に
if(hWnd != NULL){
hWnd = GetDlgItem(hDlgWnd, IDC_DELETE );
MoveWindow(hWnd,省略);
}
を記述すると思うのですが、hWndがNULLになるとMoveWindowが実行されません。
これではダメなのですが、他に方法がみつかりません

そこで、
WM_INITDIALOG内でhWnd = GetDlgItemでhWndがNULLになる事ってありますか?

たくさんのコントロールのウィンドウハンドルを取得するときの
エラー処理方法は一般的にどうなんでしょう?

宜しくお願いします。


引用未解決
トピックタグ
Shimura
 Shimura
(@Shimura)
ゲスト
結合: 22年前
投稿: 36
 

>GetDlgItemでhWndがNULLになる事ってありますか?
(MSDNより引用)
関数が失敗すると、NULL が返ります。これは、ダイアログボックスのハンドルが無効だ
ったこと、またはコントロールが存在しなかったことを意味します。

・・逆に云えば
「ダイアログボックスのハンドルが有効である」「コントロールが存在する」
「無効なコントロールIDではない」場合は NULL にはならないってことでしょう。

つうことで、NULLになる場合は(コントロールの作成を含めて)ダイアログの作成
に失敗しているのだから、「ダイアログの作成に失敗しました」とかいうエラー
メッセージを表示して、EndDialog() で抜けるとか。


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

ありがとうございます。

EndDialogをOnInitDialog内で呼んだらどうなるかを調べる為に変更したのですが、
以下の様な状態になってしまいます。

ダイアログプロシージャで
case WM_INITDIALOG:
OnInitDialog(hDlgWnd);
// 色変更用ブラシの作成
g_hbrTitle = CreateSolidBrush( TITLE_BAR_COLOR ); <----ここ2
g_hbrLabel = CreateSolidBrush( LABEL_COLOR );
break;
OnInitDialogで
hWnd = GetDlgItem(hDlgWnd, IDC_DELETE );
if( hWnd != NULL ) Err(hDlgWnd); <----ここ1
MoveWindow(hWnd, 0, 0, nWidth, LABEL_HIGHT, FALSE );

void Err(HWND hDlgWnd)
{
EndDialog(hDlgWnd, IDC_DELETE);
}
とあります。
で、ここ1が動作してEndDialogが実行されます。

この時ここ2にブレークポイントを置くと固まってしまい、
VCをタスクの終了で強制終了させないと駄目な状態になります

MFCの時は気にせず好きな所にブレークポイントを置いたのですが、
SDKでは置いてはいけない所ってあるのですか?

表題と違う質問になりますが、宜しくお願いします。


返信引用
Shimura
 Shimura
(@Shimura)
ゲスト
結合: 22年前
投稿: 36
 

関係ないかもしれないけど、OnInitDialog( HWND hDlgWnd);
も、Err( HWND hDlgWnd); も 値を返さない関数だけど、これでいいのかな?

今の状態では、Err() が呼ばれて EndDialog しても、その次の行

>g_hbrTitle = CreateSolidBrush( TITLE_BAR_COLOR );

を実行しようとするのでは?


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

まず、OnInitDialog内でEndDialogを呼んだとしても
その場でダイアログが終了するわけではないので先の処理を実行するはずです。
EndDialogを呼ぶのであれば、呼んだときは先の処理を実行せずにプロシージャを
抜けるようにするのが本当でしょう。
EndDialogは、あくまでもダイアログに終わって良いよと指示するだけなので
一旦、プロシージャからOSに制御が戻らないと実際の終了処理は走らないはずです。
ロジックの組み立てそのものに矛盾があるように思います。


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

みなさんありがとうございます。

違う箇所の問題でここの部分のソースがすっかり変わってしまいました。
なので、このスレッドは閉じます。
ありがとうございました


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました