これで、次の MFC SDI アプリケーション コードができました。このコードはビュー クラスから取得したものです。
void CNew_demo_appView::OnItemUpdate()
{
// TODO: Add your command handler code here
int i=this->GetListCtrl().GetSelectionMark();//get the selected item no
this->GetDocument()->unpacker.GetInformation(i,(BYTE*)(&(this->GetDocument()->fpga_info)));
UpdateFpgaAttrib updatefpgadlg;
updatefpgadlg.DisplayInfo(this->GetDocument()->fpga_info);
updatefpgadlg.DoModal();
}
void CNew_demo_appView::SetItemFpgaAttrib(int index,FPGA_INFO info)
{
this->GetDocument()->fpga_items[0]=info;
}
ご覧のとおり、UpdateFpgaAttrib という CDialog Derived クラスを取得し、メニュー コマンドが発行されたときに呼び出される OnItemUpdate 関数でそれをインスタンス化し、次に DoModal() ダイアログ ウィンドウをポップアップし、そのダイアログにボタンがあります。クリックすると、View クラスに属する SetItemFpgaAttrib 関数が呼び出されます。
((CNew_demo_appView*)this->GetParent())->SetItemFpgaAttrib(0,info);
ここに問題があります。この SetItemFpgaAttrib がこのポインターを使用してデータを参照すると、常にアクセス違反エラーが発生します。他の View クラス関数でこの関数を呼び出すと、問題ありません。
void CNew_demo_appView::test()
{
SetItemFpgaAttrib(0,this->GetDocument()->fpga_info)
}
ポップアップダイアログボタンによってトリガーされると、問題が発生します。 SetItemFpgaAttrib にブレークポイントを設定しました。このポインター値は通常の 0x0041237f であることがわかりましたが、ボタンによってトリガーされると、常に 0x00000001 であり、GetDocument 呼び出しは常に問題を引き起こします。 . this ポインターの値が変更されるのはなぜですか?それはコンテキストまたは他の何かが原因ですか? Vs2008 SP1 を使用しています