VC++6.0 MFCダイアログベースアプリを作成しているものです。

メインダイアログの他に別ダイアログを追加しようと思い、
新規にクラスを追加し、ダイアログを作成しました。
メインダイアログに終了ボタンがあり、押下することにより、
OnClose()を呼び、アプリを終了させています。
ここで、終了ボタンを押すと、以下のメッセージが表示されます。

ハンドルされていない例外は*****にあります。
0xC0000005: Access Violation

新規追加したクラス宣言部をコメントアウトすると、例外が発生しませんでした。

VC初心者でして、このエラーがメモリー関係では?とは想像がつくのですが、
どのようにアプリに影響しているのかがわかりません。
Access Violationが発生した時の対処法とかクラスを新規追加したことによる、
影響範囲がどの程度あるのか等、ご教授願えませんでしょうか?

よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

VC++のデバッガを使いましょう。


デバッグモードでビルドして、デバッグ-実行
してやればAccess Violationした位置でデバッガがブレークを掛けてくれるはずです。
その後、デバッガのスタックトレースウィンドウから呼び出し元をたどっていき、Access violationの原因となったコードを探しましょう。

#感じ的に初期化/確保されていないポインタ相手にアクセスしたっぽいですが・・・

また、Access Violationなどの場合、スタック破壊が起こっている場合もあります。そういう場合はブレークポイントをいくつか設定して、実行してAccess Violation位置を探しましょう。


>クラスの新規追加による影響
ちゃんと作られたプログラムに変なクラスを突っ込んだ場合は当然影響が出ます。
逆にちゃんと作られたクラスを追加した場合に問題が発生した場合、それまでのプログラムに表面化しなかった問題があった、というだけの事です。作ってる方も人間ですから完全なものは作れないですし・・・(^^;

>影響範囲
さまざまかと(^^;
C++例外でトラップしてやればAccess Violationもトラップしてやる事は出来ます(参考URLの17章参照)が、通常、起こった時点でアルゴリズム的に問題があると思います。

仕事などでやっている場合は
Purify(http://www.sra.co.jp/Rational/purify/purifyNT.ht …)やBoundsChecker(http://www.numegajapan.com/products/vc.htm)などのプログラムチェッカを導入するのも手ですね。

#蛇足
OnClose()後に例外が発生するという事は終了処理回りに不備があるのでしょう。
確保したメモリを開放していなかったり、逆に既に開放しているメモリをもう一度開放しようとしていたり・・・
ある程度経験を積めば、メモリ周りのトラブルの対処(というよりトラブルを起こさないためのプログラムか)方法も身につくかと。
確かにこの辺のプログラムスタイルについての解説はあまり無いのも確かですが、まったく無いわけでもありません。

・Effective C++
・More Effective C++
・Writing Solidcode
・Code Complete

あたりが参考になるかと思います。
また、Access Violation(というよりx86のプロテクトモードの例外機構)については
・はじめて読む486
が参考になるかと思います。

参考URL:http://www.microsoft.com/japan/developer/library …
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

QACCESS2003のデータアクセスページの使い方について

イントラ内でACCESS2003のデータアクセスページを使いたい。

1.ACCESS2003のデータアクセスページを作成しました。
2.そのMDBファイルと、データアクセスページ(htmファイル)を、WINDOWS2000ServerのInetpub内のwwwrootフォルダの中へ入れました。
3.ここにはイントラ内のHPなどを置いています。(普通に見れています。)
4.クライアントから、データアクセスページのhtmファイルを見に行くと「データソースログオン」が立ち上がります。(パスワードを設定しています。)
5.パスワードを入れるとデータアクセスページ(htm)から、通常のアクセスのフォームのごとくデータ入力が出来る予定なのですが(泣)できません。(泣)

で、悩んでおります。

ACCESS2003のMDBファイルとデータアクセスページ(HTMファイル)をサーバーのwwwrootへ置いただけでは、データアクセスページを通してmdbファイルへの入出力は不可能なのでしょうか?

Aベストアンサー

MDBに接続されたAccessプロジェクトを開いている場合データアクセスページは自動的にそのデータベースに接続されてそのパスがデータアクセスページのConnectionString プロパティに設定されます。
ページを作成した後でデータベースを移動またはコピーした場合はConnectionString プロパティに設定されているパスを更新して新しい保管場所を設定する必要がありますがどうなっていますか?
そこを確認してみてください。

QVC++6.0で、ダイアログを新規に作成し、クラスウィザードでそのダイ

VC++6.0で、ダイアログを新規に作成し、クラスウィザードでそのダイアログにクラスを割り当てる時
「クラス"CAbcDlg"のファイル(..¥AbcDlg.h, ..¥AbcDlg.cpp)を開けません」という
エラーメッセージが出て、新しいクラスを作れません。何故でしょうか?

注1)正しく作れることもあります。
注2)出来てしまったAbcDlg.hとAbcDlg.cppファイルを削除して、
  同じ操作をすると新しいクラスは作れます。

Aベストアンサー

 こんばんは。

 最近VC6.0を使用していないのですが、確かにそういう現象が発生した事は幾度となくあります。
 CLWファイル(クラスウィザードファイル)に問題があると、発生する現象です。
 プロジェクトのフォルダからCLWファイルをどこか別の場所移動した後、VC6.0を起動しなおしてプロジェクトを読み込むと、正しいCLWファイルを再生成します。此れで対処出来ると記憶しております。
 しかし、何故不完全なCLWファイルを作成してしまうのかは、未だにわかりません。
 尚、CLWファイルの実態は単なるテキストファイルですので、メモ帳などで開いて見る事が出来ます。

QAccessの使い方

アクセスに関しては、まったくの素人なので困っています。
実は会社のパソコンが、ハードディスククラッシュしまして、アクセスのデータがなくなってしまいました。
商品(冊子)を発送するために、帯封を作成したいのです。B4の用紙に3面付するつもりです。
それで、発送のエクセルの名簿は残っているのですが、それをアクセスにどのように取り込んだらいいかわかりません。
取り込んだあとの面付けやデザインなどは、参考書を見ながら勉強するつもりですが、
まず取り込み方がわからないので困っています。
アクセスに詳しい方、ぜひご指導願います。

Aベストアンサー

ちょっと今手元に
Accessの入ったマシンがないので微妙ですが
メニュー⇒ファイル⇒外部データの取り込み⇒インポート
これで取り込めると思います。
まあ方法はいろいろあると思いますよ、他にも。

Excelファイルをテーブルとしてリンクしたり、
プログラムで取り込むようにも作れます。

とりあえず、上記の方法で試してみてください。

Q(VC++.Net) クラスにクラスを属性として追加できるでしょうか?

初歩的な質問ですみませんが、教えてください。
#include <string>

class A {
int x;
int y;
std::string strX;
//↑stringクラスを使いたい。
//(charだったり上手くいく。)
};

とやると実行自体(コンパイラーエラーがたくさんでますが・・)は出来るのですが、アクションを掛けたら、"ハンドルしていない例外が発生しました"というエラーが出てしまいます。(←あたりまえか)

stringクラスに限ったことではないのですが、自作のクラスを、ほかの自作のクラスへメンバ変数?的に使用したいのですが、上手くできません。一つ二つのクラスを、ほかのクラスで使用するならば、継承すればよいのですが、一つのクラスが、たくさんのクラスを使用するような場合、どのように記述すればよいのでしょうか?
どこを勉強すればよいのでしょうか?
ご教授のほど、よろしくお願いいたします。m( _ _ )m

Aベストアンサー

自クラスで、他のクラスをメンバにすることは普通にできますが・
ひょっとしてディフォルトコンストラクタを定義してないとか??

Q.htaccessの使い方について教えてください!

こんにちは。私はHPを運営しているんですが、最近荒らしにあってしまい悩んでます。.htaccessというものを最近知ったのでそれを使ってみようと言うことになりました。それで、その荒らしのIPを弾くには

# アクセス制限
order allow,deny
allow from all
deny from ppp01.aaa.ne.jp # ppp01.aaa.ne.jp を拒否
deny from .bbb.co.jp # ???.bbb.co.jp を拒否
deny from .go.jp # 当局によるアクセスを拒否
deny from 130.90. # 130.90.???.??? を拒否

こういう風に書けばいいんだなと分かりましたが、その荒らしというのが、2ちゃんねるにHPアドレスを貼り付けたりして厄介な奴なんです。そこで、2ちゃんねるのアドレスを弾くって言うことも出来ますでしょうか?

# アクセス制限
order allow,deny
allow from all
deny from ppp01.aaa.ne.jp # ppp01.aaa.ne.jp を拒否
deny from .bbb.co.jp # ???.bbb.co.jp を拒否
deny from .go.jp # 当局によるアクセスを拒否
deny from 130.90. # 130.90.???.??? を拒否
※deny from http://●●/

↑の※のように一緒にこうやって書くのかなって思ったんですけど、どこにもそう言う書き方が載ってないのであっているかどうか教えてください。あってなかったら正しい書き方を教えてください。よろしくお願いしますm(_ _)m

こんにちは。私はHPを運営しているんですが、最近荒らしにあってしまい悩んでます。.htaccessというものを最近知ったのでそれを使ってみようと言うことになりました。それで、その荒らしのIPを弾くには

# アクセス制限
order allow,deny
allow from all
deny from ppp01.aaa.ne.jp # ppp01.aaa.ne.jp を拒否
deny from .bbb.co.jp # ???.bbb.co.jp を拒否
deny from .go.jp # 当局によるアクセスを拒否
deny from 130.90. # 130.90.???.??? を拒否

こういう風に書...続きを読む

Aベストアンサー

モジュールmod_setenvifを使って、リファラ情報から2ch.netからのリンクをたどってきたものを除外する手法がよく使われてます。
絶対確実ではないですが。

ここらへんを利用可能かどうかを、Webサーバの管理者に確認されてみては。

参考URL:http://oshiete1.goo.ne.jp/goo_search.php3?MT=setenvif+referer+allow+deny+env

QVC++6.0 ダイアログの追加について

現在,VC++6.0でSDIのプログラムを開発しています.

このプログラムのメニューからダイアログを表示させるプログラムを開発したのですが,別のプラグラマーが開発したダイアログベースのプログラムを組み込むことは可能でしようか?

また,将来的にダイアログを2つ出してその間で数値のやり取りをさせたいのですが,可能でしょうか?



もし可能でしたら教えてください.よろしくお願いします.

Aベストアンサー

ダイアログのリソースとソースファイルをプロジェクトにインポートすればよい。

2つのダイアログを出すことはモードレスダイアログであれば可能。
ダイアログ間の数値のやりとりは、いろいろと方法があるが、メッセージで十分でしょう。

Qaccessでのフィルタの使い方

住所録をアクセスで管理しています。
フィルタの使い方なんですが、抽出したもの以外を表示する方法ってあるんですか?例えば、東京都の住所を抽出して、逆に東京のレコード以外の住所だけを表示させることです。
まだ、初心者なのでさっぱりわかりません。
また、例えば、現住所と本籍が違う人だけを表示する方法ってあるんですか?

Aベストアンサー

こんばんはっ。
テーブルがどのようになっているかが良くわからないので、違うかもしれませんが
>東京都の住所を抽出して

"フォームフィルタ"をクリック(レコード→フィルタ→フォームフィルタでも可)
住所のところに(フィールドの名前がわからないので、勝手に住所と書いています)
Like "東京都*"
と入力し、フィルタを実行すると
東京都だけが抽出されます。

>東京のレコード以外の住所
上記と同じ要領で
Not Like "東京都*"
と入力し、フィルタを実行すると
東京と以外が抽出されます。

>現住所と本籍が違う人だけ
フィールドの名前が、仮に"現住所"と"本籍"だったら
上記と同じ要領で
現住所のフィールドの箇所に
<>[本籍]
と入力し、フィルタを実行すると
出来ると思います。

フィルタの実行の仕方は大丈夫ですか?
杯(さかずき)の様なアイコンが、フィルタの実行です。
全然違ったらごめんなさい。

Qメインダイアログを表示させずにファイル選択ダイアログを表示

VC++2005のMFCダイアログベースでプログラムを作成しています。

自動生成されたプログラムを何も変更しないまま実行すると、
メインのダイアログが表示されますが、
そのダイアログを表示させずに、ファイル選択ダイアログを表示させたいのです。
自分で実装しビルド実行したところ、期待動作をしましたが、
ファイル選択ダイアログを閉じた後に、画像のようなエラーが発生してしまいます。
エラーを発生させず、期待動作をさせる良い実装方法をご存知の方おられましたら、
ご教示お願い致します。

【変更実装(エラー発生)】
BOOL CtestApp::InitInstance()
{

CtestDlg dlg;
m_pMainWnd = &dlg;
//INT_PTR nResponse = dlg.DoModal(); //コメントアウト
dlg.OnBnClickedButton1(); //ファイル選択ダイアログを表示する関数
//if (nResponse == IDOK) //コメントアウト
//else if (nResponse == IDCANCEL) //コメントアウト

}
void CtestDlg::OnBnClickedButton1()
{
CFileDialog ReadDlg( TRUE, NULL, "*.txt", OFN_HIDEREADONLY | OFN_FILEMUSTEXIST,
"txtファイル(*.txt)", this );

}

VC++2005のMFCダイアログベースでプログラムを作成しています。

自動生成されたプログラムを何も変更しないまま実行すると、
メインのダイアログが表示されますが、
そのダイアログを表示させずに、ファイル選択ダイアログを表示させたいのです。
自分で実装しビルド実行したところ、期待動作をしましたが、
ファイル選択ダイアログを閉じた後に、画像のようなエラーが発生してしまいます。
エラーを発生させず、期待動作をさせる良い実装方法をご存知の方おられましたら、
ご教示お願い致します。

【...続きを読む

Aベストアンサー

ファイルダイアログを出すだけなのなら、

CtestDlgの代わりにCFileDialogにすればいいだけですよ。
CtestDlgクラスそのものがいりません。

QAccess テキストボックスの使い方について

先日、以下の通り質問をさせて頂いた者です。
https://oshiete.goo.ne.jp/qa/9529939.html

アクセスで、テキストボックスに値を入れてコマンドボタンを押すと、
検索された値が先頭に来るようにVBAを作成しました。

さらに発展系で、コマンドボタンを押さなくともテキストボックスに値を入れるだけで、
検索された値が先頭に来るようにしたいと思っているのですが、
そんな事はAccessで可能なのでしょうか。

もし可能な場合、どのような構文を使い作成すれば良いかを御教示頂けませんでしょうか。
よろしくお願いします。

(わかりづらいかもしれませんので、イメージ図を添付させて頂きました)

Aベストアンサー

BeforeUpdateで行けると思いますが。

Qメインダイアログからの各ダイアログの呼び出し時に発生するエラーについて

お世話になっています、fujitomoと申します。
現在、Visual C++のダイアログベースプログラムを作成しており、
メインダイアログから、各ダイアログ(計7つほど)にメッセージを送信したり、DoModal()で表示するために、メインダイアログのメンバ変数に各ダイアログのインスタンスを定義しました。
Ex)
CSampleAClass A;
CSampleBClass B;
このように、定義し、いざメインダイアログからダイアログを呼び出そうとしたときに以下のようなメッセージのエラーが表示されました。

Unhandled exception at 0x40042c10 in Sample.exe: 0xC00000FD: Stack overflow.

これはWindows CEのみのメッセージかもしれないのですが、たぶん言いたいことはスタックオーバーしてるよ、ということだと思います。
そこで、計7つのダイアログの定義を少なくして、6つにしたところ、上のエラーメッセージはでず、正常にダイアログが表示されました。

次にメンバ変数で各ダイアログのインスタンスを定義するのではなく、そのポインタを定義するようにプログラムを変更してみました。
Ex)
CSampleAClass* A;
CSampleBClass* B;
このようにすると、計7つのダイアログをメンバ変数に定義してもエラーが発生せずに、正常にダイアログを表示させることが出来ました。

この理由はなぜでしょうか?
C言語を始めて時間はたっているのですが、いまだにいまいちインスタンスのオブジェクトとそのポインタでの定義における違いがよく分かっていません。今回のことから、クラスをメンバ変数に定義するときはポインタで定義したほうがいいということなのでしょうか?

ご参考となる意見がございましたら、ご意見宜しくお願い致します。

尚、開発環境は
Windows CE 6.0
Visual Studio 2005
です。
宜しくお願い致します。

お世話になっています、fujitomoと申します。
現在、Visual C++のダイアログベースプログラムを作成しており、
メインダイアログから、各ダイアログ(計7つほど)にメッセージを送信したり、DoModal()で表示するために、メインダイアログのメンバ変数に各ダイアログのインスタンスを定義しました。
Ex)
CSampleAClass A;
CSampleBClass B;
このように、定義し、いざメインダイアログからダイアログを呼び出そうとしたときに以下のようなメッセージのエラーが表示されました。

Unhandled exception at 0x400...続きを読む

Aベストアンサー

CSampleAClass A;
だとスタックに
CSampleAClass* A = new CSampleAClass();
だとヒープに
オブジェクトが作成されるからでしょう。
前者の場合、単純に6つのダイアログ作成がスタックの限界だったんだと思いますよ。
リンカのオプションでスタックサイズを変えることができるので、増やしてビルドしなおせば、元のコードでも7つのダイアログを扱うことができるはずです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング