VC6からVC.net2003への変更でエラー発生 – プログラミング – Home

VC6からVC.net2003への変更...
 
通知
すべてクリア

[解決済] VC6からVC.net2003への変更でエラー発生


のり
 のり
(@のり)
ゲスト
結合: 23年前
投稿: 9
Topic starter  

アプリ開発環境のアップを思いつき、ついにVC++6をVC.net2003へあげました。
アプリをVC6で開発し、問題なく動いていましたが、それを.net2003で実行ファイルを作
成すると異常が発生してしまいます。調べていくとCStringArrayをアクセスしているとこ
ろで、エラーが発生しているようです。

Debug Asertion Failed! File:array_s.cpp Line:87

CStringArray m_Items; 
m_Items.RemoveAll(); //これを実行すると異常停止。

VC6とVC7ではなにか違うのでしょうか?
お手上げ状態になりました。
ご教授よろしくお願いします。


引用未解決
トピックタグ
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> CStringArray m_Items; 
> m_Items.RemoveAll(); //これを実行すると異常停止。

VC6でダイアログベースでプロジェクト作成。
OnInitialDialog()に上の2行を貼り付ける。
VC2003にコンバートして実行したところ再現せず。
再現する手順を説明してもらえますか?

# VC7はVC2002を指します。
# VC2003はVC7.1と言った方が良いかな。


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

実はポインタ変数になっていて未初期化のまま使っているとか、
そういったことはありませんか?
デバッグトレース・呼び出し履歴などで、深くチェックしてみてください。

なお、アサートがかかっている個所は MFC のソースなので、調べられるはずです。


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

追記。参考までに、VC7.1標準インストールなら、問題のファイルは下記に存在します。
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\mfc


返信引用
のり
 のり
(@のり)
ゲスト
結合: 23年前
投稿: 9
Topic starter  

ソースを端折ったので詳細を記述します。
#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したいと思います。
今後もよろしくお願いします。


返信引用
赤猿
 赤猿
(@赤猿)
ゲスト
結合: 17年前
投稿: 2
 

> File:array_s.cpp Line:87

ここは調べてみましたか?
その行にはなんて書いてありますか?

# 手元に VC6 と VC8 しかないので、
# 確認できないのです。(泣)


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> VC6で作成しリリースして6年間以上の実績があり、今回VC7.1にしたことで発生している
> のでVC7.1からみと判断しました。これなら同様なことはいろいろなところで起こってい
> て経験者がいるのではと思いました。

CCombGridCtrlの実装が判らないけど、VC6のみで使えるトリッキーなコードなのかも
しれません。名前からするとコンボボックスがグリッドに表示されるのかな?
トリッキーでないにしても、それなりに作者の工夫が施されていて、
それがVC7.1で動かないと。そうだとすると、CCombGridCtrlをVC7.1で使おうと
している人でしかこの現象は起きないと思います。

> VC6版は、たまたま動いていたとの認識に戻り、詳細をDebugしたいと思います。

VC6で動いていてVC7.1で動かなくなったとはいえ、
VC6版はたまたまではなく、正しく動いていたのかもしれません。

デバッグ頑張ってください。

# 新しいプロジェクトでCComboGridCtrlを貼り付けて試すと、
# グリッドが問題か、グリッド以外が問題かが判断しやすいかも。

# CodeGuruのCCombGridCtrlへのリンクを貼ると、見てくれる人がいるかも。


返信引用
のり
 のり
(@のり)
ゲスト
結合: 23年前
投稿: 9
Topic starter  

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での動作補償はない?


返信引用
のり
 のり
(@のり)
ゲスト
結合: 23年前
投稿: 9
Topic starter  

続報です。
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を作るところは変えてないのですが?
どこで設定されるのでしょうか?


返信引用
赤猿
 赤猿
(@赤猿)
ゲスト
結合: 17年前
投稿: 2
 

> MyFormViewでGrid表示は正しく表示されています。
> そこで、Gridデータを書換えようとすると落ちます。

Gridデータを書き換えようとすると落ちるということは、
一度は m_dGrid.m_Items にデータを設定できたということですか?

# コードが膨大すぎて、
# m_Grid と m_dGrid の二つ存在していることに
# 気づいていないとかは・・・ないですよね、すみません(^^;。


返信引用
のり
 のり
(@のり)
ゲスト
結合: 23年前
投稿: 9
Topic starter  

> 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 );
を使用して表示しています。


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 18年前
投稿: 178
 

CCombGridCtrlは自分で手を入れているのでしょうか?
クラス内のメンバとか不明っぽいのですが…
# 「CComboGridCtrlのリンク先」のサンプル見ましたが、m_Itemsが無かったような?

>Grid初期化で
>m_dGrid.SetItemText(i+1, COLITEM, xStr );
>を使用して表示しています。

で設定されたものを、
CCombGridCtrl内のCStringArray型変数であるm_Itemsに入れるように実装しています?
m_Itemsのコンストラクタは実行されているんでしょうか?


返信引用
のり
 のり
(@のり)
ゲスト
結合: 23年前
投稿: 9
Topic starter  

連絡遅れて申し訳ありません。
下記追加でとりあえず解決したようです。
CComboGridCtrl::CComboGridCtrl()
{
m_Items.RemoveAll();//追加
}

あとは、言い訳じみたものです。
CCombGridCtrl()6年ほど前に実装したときに、m_Itemsを自分で追加しましたが、追加し
たことを忘れてました。またVC6で問題なく動いていて、VC7.1にしたときに急にエラーに
なりだしたのでVC7.1のせいだと思い込んでしまいました。
”まず原点に戻り、ソース検証する!”大切が身にしみました。
お騒がせしまして申し訳ありませんでした。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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