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() 弹出Dialog 窗口,在那个对话框上,有一个按钮,当点击它会调用属于View Class的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-Derived 类 CNew_demo_appView 的一个函数,它不是 CWnd 的成员,所以返回的 CWnd*指针无法获取该函数的代码,如果您像我一样这样做,您将访问一些错误的地方并且会出现违反访问错误等。我需要一个返回原始 CNew_demo_appView* 指针值的函数,即 m_pParentWnd 中的那个是需要的值(当我进入 CWnd::GetParent 函数时我就知道了),而默认的 GetParent 是这样做的:

return (CWnd*)ptr;

为了解决这个问题,我只是在我的 CDialog-Derived 类中添加了另一个函数:

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 回答