это значение указателя изменилось в приложении MFC 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;
}

Как видите, у меня есть производный класс CDialog с именем UpdateFpgaAttrib, я создаю его экземпляр в функции OnItemUpdate, которая вызывается, когда выдается команда меню, затем DoModal() всплывает диалоговое окно, в этом диалоговом окне есть кнопка, когда щелкнув, он вызовет функцию 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


person Minghao Ni    schedule 29.12.2012    source источник


Ответы (1)


Проблема решена, я просто хочу поместить ответ здесь для кого-то еще, у кого когда-нибудь тоже возникла эта проблема. Проблема заключается в

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

GetParent() реализован в CWnd и возвращает CWnd*, вот в чем проблема, SetItemFpgaAttrib(0,info) является функцией моего класса CNew_demo_appView, производного от CDialog, он не является членом 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();

Тогда все в порядке.

Итак, вывод: приведение CWnd* в GetParent изменило значение указателя.

person Minghao Ni    schedule 30.12.2012