ダイアログベースに配置したエディットボックスやボタンを削除するとエラーが表示されてしまいます。プログラムの起動自体はできるのですが、その後プログラムを止めるとエラーが表示されてしまうのです。特にエディットボックスを削除すると、KERNEL32.DLLというエラーがでたり、Debug Library Failedというエラーがでてしまいます。エディットボックスにはメンバ変数を設定していたので、変数を消して削除したのですが…。ボタンやボックスを削除する際、削除の手順なんかはあるのでしょうか?またこのエラーを回避する方法を教えてもらえないでしょうか?お願いいたします。
追加したときと逆の手順を踏めばいいだけです。
・リソースID
・メッセージハンドラ
あたりですかね。リソースエディタ上でコントロールを削除しても
IDは消えなかった(はず)なので、そのIDを使用して何か処理を
行おうとすると当然どっかで実行時エラーが発生します。
クラスウィザードでメンバ変数を設定した場合、クラスウィザードから
それを削除しないと、なんかいろいろやっかいです。
void CXXDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CXXDlg)
DDX_Control(pDX, IDC_EDIT1, m_edit_ctrl);
DDX_Text(pDX, IDC_EDIT1, m_str);
//}}AFX_DATA_MAP
}
ここいらへんになんか残っていませんか。それらしいコントロールID等が
あれば、削除します。
返信ありがとうございます。とりあえずcppファイルとhファイルをみたのですが、ボタンを削除する際に色々と削除するものが、エディットボックスを削除するときにはないのです。そういうものなのでしょうか?というかメンバ変数を消したときに自動的に消えるようなのですが…。あとリソースのhファイルにはそれらが
#define Edit1 ****
のような形でのこってました。これらを削除すればエラーは消えるのでしょうか?
よろしくお願いいたします。
前も書きましたがウィザードに頼らずにコントロールを
消したければリソースIDとメンバ変数を直接消して、
コンパイルを通るように(私は)修正してます。
#あまりお奨めしませんが。
だからEdit1とやらを消してコンパイルを通るように
してやればいいはずです。
返信ありがとうございます。resouse.hの中にあった#define Edit1 ****を消してみたのですがどうにもエラーが消えません。もともとコンパイル、ビルドは通り、プログラムは起動するのです。しかし、終了ボタンを押すと閉じた後、エラーの表示(KERNEL32.DLL)がでてくるのです。
void CXXDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CXXDlg)
//}}AFX_DATA_MAP
}
ここの部分には何もなく、また他に探してもEditに関するものがみあたりません。
メンバ変数のm_* = 0; とかもしっかりと消えてますし…。イマイチ理由がわかりません。どうしたらよいのでしょうか?よろしくお願いいたします。
> KERNEL32.DLLというエラーがでたり、
> Debug Library Failedというエラーがでてしまいます。
エラーの内容にヒントとなる情報があったりしませんか。
Debug Library Failed というのは多分 assertion を
さしていると思うのですが、このダイアログに表示される
具体的なメッセージはどんなものが出ていますか。
# 普通ここにエラー内容が書いてあるはずですけど.....。
返信ありがとうございます。エラーの内容は
File afx.inl
line 122
"0x77e5b59d" の命令が"0xfffffff4"のメモリを参照しました。メモリが"written"になることができませんでした。
のような内容でした。afx.inlというファイルがいったいどこにあるのか分かりません。そのファイルの122行目に原因があるとは思うのですが…。Stdafx.hというファイルはありますが122行もありませんしどこに隠れているのでしょうか?それともほかに原因があるのでしょうか?お願いします。
File afx.inl
line 122
どうもここのASSERT にかかってるみたいです。
# afx.inl はMFCのインクルードディレクトリにあるはずです。
********************************
// CString
_AFX_INLINE CStringData* CString::GetData() const
{ ASSERT(m_pchData != NULL); return ((CStringData*)m_pchData)-1; }
********************************
ということで、Edit を CString に関連付けたことがあって
それがちゃんと解消できていないとか、そんなところでしょうか。
# プリコンパイルファイルに古いファイルが残ってるとかは大丈夫ですか。
# 一度クリーンした方が安全かも。
返信ありがとうございます。DEBUGファイルにあった更新されていないファイルを全て削除し、新たにコンパイル、ビルドしなおしたところエラーがでなくなりました。いったいなぜなのかはわかりませんが…。とりあえず解決したということなのでしょうか?
とりあえず解決とさせていただきます。ありがとうございました
ツイート | ![]() |