• ベストアンサー

【VC++6.0(MFC)】MessageBoxを使わず、MessageBoxと同機能を表現するには?

いつも大変お世話になっております。 VC++初心者です。 現在、先人のつくったソースを見直しています。 ある条件になるとエラーを知らせるMessageBoxを出力するのですが、 デバグモードでMessageBoxが使われれている全ての箇所に ブレイクポイントをおいても、それらのブレイクポイントに引っかかって くれません。 そうなると、MessageBox以外の命令でMessageBoxと同様のことを しているコードがあると思っているのですが、そういう機能の命令 はどのようなものがあるのでしょうか。 お手数ですが、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#96502
noname#96502
回答No.9

まず何度かエラーメッセージが表示されているみたいなので、再現性があると思うのですが、再現手順は確立されているんでしょうか? 確立されているのなら、デバッグしながらその手順を行いプログラムを1行ずつ実行させれば良いと思うのですが。 確立されていないなら、確立する努力をするのが一番の近道だと思います。(コードの量と再現率によりますが) それでも無理なら動的解析ツールを使った方が良いかも知れません。 以下はつぶやき。 MFCを使っているなら、メモリーリークはそれ程気にしなくても良いかも。MFC自体がリークしてるので。。。 それから動的なメモリ確保のメリットってどれくらいあるのでしょうか。。。 組込みの開発をしていて、ファイルの書き込み回数の制限があった時に圧縮をするときには圧縮後のサイズが事前に分からないので動的にメモリを確保しましたが、それ以外で動的にメモリを確保するメリットがあまり思い浮かびません。 PCアプリなら単純にファイルに書き込めば良いですし。。。 遠い記憶ですが、データサイズが事前に予測できないデータをファイルに書き込んでも、書き込んだデータは実はメモリ上に保持されていてファイルストリームを使って引き回しても処理速度が落ちなかった経験がありました。。。

yuki7091
質問者

お礼

皆様、ご回答ありがとうございました。 (すみません、しばらく放置しておりました。) まだ解決していませんが、勝手ながら 本件は一度締め切らせていただきます。 ご協力ありがとうございました。

その他の回答 (8)

回答No.8

ちなみに、以前に貴方が以下で質問された件について http://oshiete1.goo.ne.jp/qa5198719.html >>オブジェクトのポインタを保持する変数に上書きでnewしてないか? >すみません、これはどういうことなのでしょうか。 例題は悪いですが、以下のようなソースコードがあったとします。 -------------------------------------- int main() { int *a; int h = 0; printf("start\n"); for (;;) { a = new int[16384]; h = h % 6; if (h == 0){ Sleep(1); } if (h % 2 == 0){ delete[] a; //←hが1,3,5の時に呼ばれないため、メモリリークが発生する。 } h++; } printf("end\n"); } -------------------------------------- この場合、forループの中でnewは毎回呼ばれますが、deleteは2回に1回しか呼ばれません。 それでもaは毎回、新しく確保した領域のアドレスを保持するため2回に1回は確保したアドレスを何処にも保存することなく過ぎて行ってしまいます。 そのため、開放するために必要な情報(アドレス)が何処にも保存されていないためdeleteする事が出来なくなってしまいます。 結果、メモリリークが発生します。 またC++には例外処理があり、一見newした領域が必ずdeleteされるように見れるソースコードでもdeleteを通過せずに抜けてしまう場合があります。(以下ソースコード参照) -------------------------------------- #include<stdio.h> #include<stdlib.h> class CMyReigai{ }; void func_a(); int main() { int *a; try { a = new int[1024]; func_a(); printf("normal end\n"); delete[] a; } catch( CMyReigai ex ){ printf("error end\n"); } getchar(); } void func_a() { CMyReigai b; throw b; } -------------------------------------- デバッグモードで追っていけば分かりますが、func_aをコールした後、deleteが実行されずにcatchに処理が流れます。 上記の原因でメモリリークする場合もあります。。。

回答No.7

お疲れ様です。 メモリリークだと思い、興味があって調べてみましたが結果はまだ出ていません。 メモリリークの原因としてはnewより、newで確保した領域がなんらかの原因でdeleteされていない方が多いと思います。 そこで、googleで「メモリリーク mfc」で検索してみました。 そうすると「DEBUG_NEW」に行き着きました。 「DEBUG_NEW」を定義すればメモリリークの検出手助けになると記載されているようですが、イマイチ使用方法が不明です。 そして、デバッグ版でコンパイルされた時のみしかつかえないようです。 あとは、malloc,free,new,deleteをラップして調べてみるしかないと思ったのですが、イマイチよいソースコードが記述出来ていません。 方法としては以下を考えています。 (1)newやmallocで確保した場合、確保したアドレスとソースコードのファイル名・ラインを保存  (ファイル等で保存[アドレスはvoidにキャストして保存]) (2)deleteやfreeで開放したアドレスをキーに、(1)の対応した領域を削除 メモリリークが発生した時にファイルの中をのぞいて、同じ位置で確保し開放されていないエリアがたくさんあれば、その確保した処理に対する開放処理が無いか、何らかの原因で呼ばれなくなっているかだと思います。 興味があるのでもう少し調査や検討をしてみます。 もし、ご自身で分かられた場合は申し訳ありませんが方法を教えて頂けると幸いです。 メモリリークは10年ほど前にPL/Mでプログラムを組んでいた頃に経験はしましたが、デバッグは経験者にまかせてしまったので解決方法はイマイチ覚えていません。

参考URL:
http://d.hatena.ne.jp/wata_d/20080304/1204609100
回答No.6

 こんばんは。  newの内部で「CMemoryExceptionクラス」が発生しているのではないでしょうか。  http://msdn.microsoft.com/ja-jp/library/bc8b34bc(VS.80).aspx  newを使用している箇所を以下の様にすれば特定し易くなると思います。 try { ???* p = new ???(...); } catch(CMemoryException* e) { ::MessageBox(NULL, NULL, NULL, IDOK);//●ココにポイントを張る }

回答No.5

No.3です >>まず、ダイアログに表示されているメッセージ内容を教えてください。 >そのダイアログに表示された内容は、 >タイトル     :XXXX(プロジェクト名です。(拡張子はついておりません。)) >メッセージ内容:Out of memory 典型的なメモリ管理(製造)ミスのメッセージですね。 ここでいう「メモリ」とはPCの「(OSが認識している)物理的な」メモリではなく、プログラムとして誤ったメモリ操作をしていることを意味しています。 >>No.2氏が書かれている通り、MFCやOSが出しているものではないですか? >そうなのかも知れませんが、誰がどこで出しているか検討がついていないのが現状です。 やることはたった一つです。「原因の絞り込み」これだけです。 ・実際にどのようにアプリを操作したら発生するのか ・アプリ発生時に動作している処理の特定 これを大きなところから、しだいに狭い領域に絞り込んでいきます。 プログラムは、そのプログラムだけで動作が簡潔しているのではなく、APIの呼び出し先はDLLとして別ファイル(プログラム)として存在します。 そういった箇所の問題であれば、いくら「ダイアログが出るから」と自分のソースの表示箇所だけを追いかけても永久にたどり着くことはできません。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.4

例えばRuntime errorとか

回答No.3

>ある条件になるとエラーを知らせるMessageBoxを出力するのですが、 そもそも、その「表示内容」はプログラム中で設定されている内容が表示されていますか? No.2氏が書かれている通り、MFCやOSが出しているものではないですか? まず、ダイアログに表示されているメッセージ内容を教えてください。

yuki7091
質問者

補足

ご回答、ありがとうございます。 本件は、以前も相談させていただきましたが、解決できなかったので、 再度質問させて頂いております。 >そもそも、その「表示内容」はプログラム中で設定されている内容が表示されていますか? そのMessageBoxに書かれている内容は、プログラム中には発見できませんでした。 >No.2氏が書かれている通り、MFCやOSが出しているものではないですか? そうなのかも知れませんが、誰がどこで出しているか検討がついていないのが現状です。 >まず、ダイアログに表示されているメッセージ内容を教えてください。 そのダイアログに表示された内容は、 タイトル     :XXXX(プロジェクト名です。(拡張子はついておりません。)) メッセージ内容:Out of memory です。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.2

MessageBoxに表示されているメッセージを検索してみたら? 案外MFCとかが出しているMessageBoxとかもあるから、闇雲にブレークポイントを張るのは得策じゃないと思う。

yuki7091
質問者

補足

ご回答、ありがとうございます。 MessageBoxに表示されているメッセージを検索しても 引っかからないのです。 >案外MFCとかが出しているMessageBoxとかもあるから、 これはどういうことなのでしょうか?

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

DoModal( )でモーダルダイアログが表示できます。

yuki7091
質問者

補足

ご回答、ありがとうございます。 使用しているすべてのDoModal( )にブレイクポイントを 設定しても、引っかかりませんでした。

関連するQ&A

  • 【VC++6.0(MFC)】警告「LINK : warning LNK4075:」の対処方法を教えてください。

    いつもお世話になっています。 VC++初心者です。 先人が残したVC++6.0のMFCのソースをリビルドすると 以下のような警告がでます。 ***** コードを生成中... リンク中... LINK : warning LNK4075: /EDITANDCONTINUE は /INCREMENTAL:NO の指定によって無視されます ***** リンクがうまくできていないようですが、この対処の仕方を教えていただけませんでしょうか。 よろしくお願いします。

  • 【VC++6.0(MFC)】Access Violationの対応の仕方

    いつも大変お世話になっております。 VC++初心者です。 現在、VC++6.0(MFC)で先人が作成したソースを改良しています。 デバグモードで動かすと、 以下のメッセージが表示されるのですが、 どのように対応すればよいか、教えていただけませんでしょうか。 「例外処理 (初回) は XXXX.exe (NTDLL.DLL) にあります: 0xC0000005: Access Violation」 (※XXXXはプロジェクト名です。) (※デバグモードで動かすと同時に上記エラーが出力されます。) 上記のエラーが出ていても動かせるのですが、 デバグモード時に、メニューの「デバッグ」、「例外処理」で 「 Access Violation」の設定を 「ハンドルされてなければ停止」から「常に停止」に変更すると、 最初の画面も開けずに、混合モード画面の 7C95AB0A inc dword ptr [eax+10h] という箇所で必ず止まって、落ちてしまいます。 ここから、どのように対処すればよいか、ご教授頂きたくお願いします。

  • 【VC++6.0】MFCを利用する参考書を教えてください。

    いつもお世話になっております。 VC++初心者です。 現在、VC++6.0で過去のソースを改良しているのですが、 (個人的な主観ですが)普通のCあまりにコードが 異なりすぎていて、なかなか作業がはかどりません。 (といっても、C言語も熟知は全然していないです。) そこで、以下の内容を満たすような参考書をご存知で あれば教えて頂きたくお願いします。 *************************** ・初心者向け。 ・VC++6.0、MFCの内容。 ・1つの課題があり、それを順次作り込んでいくような内容。 ・オブジェクト指向の説明がある。  (手続き型とオブジェクト指向型プログラミングの   対比があれば嬉しいです。) ・オブジェクト指向でコーディングされている。 ・デバグの仕方、ソースコードの追い方が若干詳しく書かれてる。 *************************** 以上、よろしくお願いします。

  • VC++.NET2003でユーザー関数内でMessageBox::Show()が使えません??

    VC++.NET 2003 のヘルプの、「チュートリアル : 簡単な Windows フォームの作成」に MessageBox::Show()関数を使ってHello,worldを表示させる例が書いていますが、 この関数を、自分で作った関数(フォームのクラスのメンバ関数で、 関数のコードはインライン関数でなく、cppファイル側に書いています)に持っていくと、 error C2653: 'MessageBoxA' : 識別子がクラス名でも名前空間名でもありません。 error C2660: 'System::Windows::Forms::Control::Show' : 関数に 1 個の引数を指定できません。 と、コンパイルエラーが出てしまいます。 MessageBox::Show()を自前の関数で使う方法を、 どなたか教えていただけないでしょうか?

  • VC++の参考書

    VC++(マネージコードではない)の参考書を探しています。 VC++2005かVC++6のどちらかで、MFCを利用するような形で。 1つ1つの機能や命令の説明がされているのではなく、1冊や 各章ごとに1つのアプリケーションを作る、その上で機能や 命令が説明されている、みたいな参考書を探していますが、 今のところ出会えません。 結構VB6だったり.NET系の参考書だとそういうのも多いようですが、 VC++に関しては全然見つかりません。 ご存知の参考書がありましたらご紹介下さい。

  • 【VC++6.0(MFC)】「Out of memory」の対処の仕方を教えてください。

    いつも大変お世話になっております。 VC++初心者です。 現在、VC++6.0(MFC)のソース修正を行っております。 そのソースを長時間実行させると、メッセージボックスで タイトル:ソフト名 メッセージ:Out of memory と出てきて悩んでいます。 (コンパイル、ビルドは成功しています。) (そのソフトを立ち上げなおすと、しばらくの間は正常に動作します。) 大変お手数ですが、 この問題を対処する手順や怪しいと思われる箇所を 経験則でも宜しいので教えて頂けませんでしょうか。

  • 【VC++2005(CLR)】コンソール画面(?)を表示させたい

    いつもお世話になっております。 VC++初心者です。 超超基本的なことなのですが、 Console::WriteLine("aiueo"); と書いた場合、どこに出力されますか? この命令は実行されていると思うのですが、 出力が確認できていないので、困っています。 すみませんが、よろしくお願いします。

  • Session.Countについて(VC2010)

    WEBアプリケーションを作成しております。 VC2005から、VC2010のソースコードアップグレードで、 if(this.Session.Count ==0)の部分でエラーになってしまうのですが、 VC2010では、「this.Session.Count ==0」の部分をどのように変更すればよいのでしょうか? ご存知の方、ご教授願います。

  • 【VC++6.0】ソースコードの文字の大きさを変更させるには?

    いつもお世話になっております。 VC++初心者です。 VC++6.0 enterprise editionを使用していますが、 表示されるソースコードの 文字の大きさを変更できずに困っています。 (VC2005 express editionではできたと思います。) ご存知の方がいらっしゃいましたら、ご教授下さい。

  • イベントハンドラが取得できない VC++ MFC

    おはようございます(><) VC++.NETで開発を行っています。 MFCを使って開発をしています。 CDialogを継承したCmyDialogでOnLButtonDownのイベントがとれません。 OnLButtonDownのイベントを使いたかったのですが 自動でイベントを設定するプロパティのメニュー(雷のマークみたいなもの)にイベントがなかったので 自分でCmyDialog::と書いたらリストの中に OnLButtonDown( UINT nFlags,CPoint point)がでたので 定義に追加、イベントの記述を追加しました。 雷マークで作ったイベントのコードには // TODO : ここにコントロール通知ハンドラ コードを追加します。 と自動で記述され、ブレイクポイントを設定するとそこで止まるのですが 私が記述したLButtonDownのイベントでは実行してもブレイクポイントで止まりません。 他のイベントと比べて違うのは BEGIN_MESSAGE_MAP(CmyDialog, CDialog)の中に ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST1, OnLvnColumnclickList1) のように イベントハンドラ名、リソース名?、イベント名 と自動で記述があります。 ここを追加すればいいのかなと思いましたが 左クリックに対応するイベントハンドラ名が分かりません。 問題解決に有効な情報をお持ちの方 お力をお貸しください。 よろしくお願いします(><)