アプリ開発環境のアップを思いつき、ついにVC++6をVC.net2003へあげました。
アプリをVC6で開発し、問題なく動いていましたが、それを.net2003で実行ファイルを作
成すると異常が発生してしまいます。調べていくとCStringArrayをアクセスしているとこ
ろで、エラーが発生しているようです。
Debug Asertion Failed! File:array_s.cpp Line:87
CStringArray m_Items;
m_Items.RemoveAll(); //これを実行すると異常停止。
VC6とVC7ではなにか違うのでしょうか?
お手上げ状態になりました。
ご教授よろしくお願いします。
> CStringArray m_Items;
> m_Items.RemoveAll(); //これを実行すると異常停止。
VC6でダイアログベースでプロジェクト作成。
OnInitialDialog()に上の2行を貼り付ける。
VC2003にコンバートして実行したところ再現せず。
再現する手順を説明してもらえますか?
# VC7はVC2002を指します。
# VC2003はVC7.1と言った方が良いかな。
実はポインタ変数になっていて未初期化のまま使っているとか、
そういったことはありませんか?
デバッグトレース・呼び出し履歴などで、深くチェックしてみてください。
なお、アサートがかかっている個所は MFC のソースなので、調べられるはずです。
追記。参考までに、VC7.1標準インストールなら、問題のファイルは下記に存在します。
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\mfc
ソースを端折ったので詳細を記述します。
#include GridCtrl.h・・・Written by Chris Maunder CodeGURU
Class CMyFormView:public CFormView{
CCombGridCtrl m_Grid;
:
}
void CMyFormView::OnGridBeginEdit( NMHDR* nminfoarg, LRESULT* pRes )
{
NM_GRIDVIEW* nminfo = (NM_GRIDVIEW*) nminfoarg;
m_dGrid.m_Items.RemoveAll(); //これを実行すると異常停止。
m_dGrid.m_DropdownList= FALSE;
m_dGrid.m_ListNum= 0;
:
}
MyFormViewでGrid表示は正しく表示されています。
そこで、Gridデータを書換えようとすると落ちます。
VC6で作成しリリースして6年間以上の実績があり、今回VC7.1にしたことで発生している
のでVC7.1からみと判断しました。これなら同様なことはいろいろなところで起こってい
て経験者がいるのではと思いました。
ソースフォルダを指定しなかったので、アセンブラソースが表示されそれがCallを繰り返
すので追えなくなってしまいましたがソース表示でデバッグしてみます。
VC6版は、たまたま動いていたとの認識に戻り、詳細をDebugしたいと思います。
今後もよろしくお願いします。
> File:array_s.cpp Line:87
ここは調べてみましたか?
その行にはなんて書いてありますか?
# 手元に VC6 と VC8 しかないので、
# 確認できないのです。(泣)
> VC6で作成しリリースして6年間以上の実績があり、今回VC7.1にしたことで発生している
> のでVC7.1からみと判断しました。これなら同様なことはいろいろなところで起こってい
> て経験者がいるのではと思いました。
CCombGridCtrlの実装が判らないけど、VC6のみで使えるトリッキーなコードなのかも
しれません。名前からするとコンボボックスがグリッドに表示されるのかな?
トリッキーでないにしても、それなりに作者の工夫が施されていて、
それがVC7.1で動かないと。そうだとすると、CCombGridCtrlをVC7.1で使おうと
している人でしかこの現象は起きないと思います。
> VC6版は、たまたま動いていたとの認識に戻り、詳細をDebugしたいと思います。
VC6で動いていてVC7.1で動かなくなったとはいえ、
VC6版はたまたまではなく、正しく動いていたのかもしれません。
デバッグ頑張ってください。
# 新しいプロジェクトでCComboGridCtrlを貼り付けて試すと、
# グリッドが問題か、グリッド以外が問題かが判断しやすいかも。
# CodeGuruのCCombGridCtrlへのリンクを貼ると、見てくれる人がいるかも。
array_s.cppの87行目はここでした
85 void CStringArray::SetSize(INT_PTR nNewSize, INT_PTR nGrowBy)
86 {
87 ASSERT_VALID(this); ←ここ
88 ASSERT(nNewSize >= 0);
89 :
CComboGridCtrlのリンク先です。
http://www.codeguru.com/cpp/controls/controls/gridcontrol/article.php/c2243/
CComboGridCtrlのベースクラスは、CGridCtrlです。
CGridCtrlもMr.Chris MaunderのGood Job!なGridソフトです。
LastVersionが1999で開発環境VC6なのでVC7.1での動作補償はない?
続報です。
85 void CStringArray::SetSize(INT_PTR nNewSize, INT_PTR nGrowBy)
86 {
87 ASSERT_VALID(this); ←ここ
88 ASSERT(nNewSize >= 0);
89 :
VC6では、(this)
CStringArray.CObject.__pVfptr=0x5f4acf7c const CStringArray::'vftable
VC7.1では(this)
CStringArray.CObject.__pVfptr 0x00000000
?Null-Pointer??? 原因はこれ!?
でもDeep過ぎて、これがなにかわからりません。
Gridをクリックして、CombBOXを作るところは変えてないのですが?
どこで設定されるのでしょうか?
> MyFormViewでGrid表示は正しく表示されています。
> そこで、Gridデータを書換えようとすると落ちます。
Gridデータを書き換えようとすると落ちるということは、
一度は m_dGrid.m_Items にデータを設定できたということですか?
# コードが膨大すぎて、
# m_Grid と m_dGrid の二つ存在していることに
# 気づいていないとかは・・・ないですよね、すみません(^^;。
> m_Grid と m_dGrid の二つ存在していることに
> 気づいていないとかは・・・ないですよね、すみません(^^;。
惑わしてすみません。誤記です。
Class CMyFormView:public CFormView{
CCombGridCtrl m_dGrid; // <1>誤記修正 m_Grid → m_dGrid
:
}
>Gridデータを書き換えようとすると落ちるということは、
>一度は m_dGrid.m_Items にデータを設定できたということですか?
Grid初期化で
m_dGrid.SetItemText(i+1, COLITEM, xStr );
を使用して表示しています。
CCombGridCtrlは自分で手を入れているのでしょうか?
クラス内のメンバとか不明っぽいのですが…
# 「CComboGridCtrlのリンク先」のサンプル見ましたが、m_Itemsが無かったような?
>Grid初期化で
>m_dGrid.SetItemText(i+1, COLITEM, xStr );
>を使用して表示しています。
で設定されたものを、
CCombGridCtrl内のCStringArray型変数であるm_Itemsに入れるように実装しています?
m_Itemsのコンストラクタは実行されているんでしょうか?
連絡遅れて申し訳ありません。
下記追加でとりあえず解決したようです。
CComboGridCtrl::CComboGridCtrl()
{
m_Items.RemoveAll();//追加
}
あとは、言い訳じみたものです。
CCombGridCtrl()6年ほど前に実装したときに、m_Itemsを自分で追加しましたが、追加し
たことを忘れてました。またVC6で問題なく動いていて、VC7.1にしたときに急にエラーに
なりだしたのでVC7.1のせいだと思い込んでしまいました。
”まず原点に戻り、ソース検証する!”大切が身にしみました。
お騒がせしまして申し訳ありませんでした。