0

これで、次の 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 を使用しています

4

1 に答える 1

0

問題は解決しました。いつかこの問題を抱えた他の誰かのために、ここに答えを書きたいと思います。問題は

((CNew_demo_appView*)this->GetParent())->SetItemFpgaAttrib(0,info);

GetParent() は CWnd に実装されており、CWnd* を返します。これが問題です。SetItemFpgaAttrib(0,info) は私の CDialog 派生クラス CNew_demo_appView の関数であり、CWnd のメンバーではないため、返された CWnd*ポインターはその関数へのコードを取得できません。私のようにそれを行うと、間違った場所にアクセスし、アクセス違反エラーなどが発生します。元の CNew_demo_appView* ポインター値、m_pParentWnd にあるポインター値を返す関数が必要です。は必要な値です (CWnd::GetParent 関数に足を踏み入れると、これがわかります)。一方、デフォルトの GetParent はこれを行いました。

return (CWnd*)ptr;

この問題を解決するには、CDialog 派生クラスに別の関数を追加するだけです。

CWnd* UpdateFpgaAttrib::GetParentView(void)
{
    return this->m_pParentWnd; //just return the parent wnd pointer
}

次に、デフォルトの GetParent の代わりにこれを呼び出します。

CNew_demo_appView* view=(CNew_demo_appView*)this->GetParentView();

その後、すべて問題ありません。

結論: GetParent の CWnd* キャストがポインターの値を変更しました。

于 2012-12-30T11:38:47.577 に答える