此指针值在MFC SDI应用程序中更改

时间:2012-12-29 07:54:38

标签: mfc this sdi

现在我有以下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() 弹出对话框窗口,在该对话框上,有一个按钮,点击它时会调用 SetItemFpgaAttrib函数,属于View Class,

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

这是问题所在 SetItemFpgaAttrib使用这个指针引用一些数据,它总是遇到一些Access Violation Error,当我在其他View类函数中调用这个函数时,没关系,

void CNew_demo_appView::test()
{
    SetItemFpgaAttrib(0,this->GetDocument()->fpga_info)
}
当弹出对话框按钮触发时,它引起问题,我在SetItemFpgaAttrib上设置断点,我发现这个指针值正常是0x0041237f的事情,但是当按钮触发时,它始终是0x00000001,GetDocument调用总是引起问题。为什么这个指针值发生了变化,是由上下文引起的还是其他什么?我正在使用Vs2008 SP1

1 个答案:

答案 0 :(得分:0)

问题解决了,我只想把答案放在其他有一天也遇到这个问题的人身上。 <问题是

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

GetParent()在CWnd中实现,它返回CWnd *,这就是问题,SetItemFpgaAttrib(0,info)是我的CDialog-Derived类CNew_demo_appView的函数,它不是CWnd的成员,所以返回CWnd *指针无法获取该函数的代码,如果你像我一样,你将访问一些错误的地方,并将得到Access违反错误等。我需要一个函数,返回原来的CNew_demo_appView *指针值,一个在m_pParentWnd中是需要的值(当我进入CWnd :: GetParent函数时我想出来了),而默认的GetParent执行了这个:

return (CWnd*)ptr;

要解决这个问题,我只需在CDialog-Derived Class中添加另一个函数:

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 *强制改变了指针的值。