概述
原因分析:
DOC和VIEW的初始化顺序是先DOC 在VIEW,在DOC的构造函数调用GETVIEW是得不到POS的。
解决办法:
在想调用的时候在调用,而不是初始化的时候。
附注:MFC类文件的初始化先后顺序为:
app::InitInstance() 应用程序初始化,——>
doc构造函数初始化——>
CMainFrame::PreCreateWindow()初始化——>
View构造函数初始化——>
CMainFrame::OnCreate() 主程序框架创建 ——>
view::OnInitialUpdate() 视图初始化 ——>
view::OnDraw() 视图绘制
MFC单文档程序中线程调用view类指针应该注意的事项:
MFC单文档程序,我自已添加了Data.cpp Data.h。出错语句为Data.cpp中的
-
C/C++ code
-
// CWnd *pcwnd;
// pcwnd = ((CMainFrame*)AfxGetMainWnd())->GetActiveView(); // 本来用这句,为找错分为两句
CWnd * pmainfram;
pmainfram = AfxGetMainWnd(); // 断点查看,这里正常获得
// (CView*)pcwnd->SendMessage(WM_MY_NEWCONNECT,0,0);
CWnd * pview;
pview = ((CMainFrame * )pmainfram) -> GetActiveView(); // 出错 unhandled
文件的包含情况是 文档和框架的CPP文件中都包含 Data.h Data.cpp中包含如下:
-
C/C++ code
-
#include " stdafx.h "
#include " Dream.h "
#include " DreamDoc.h "
#include " Data.h "
#include " MainFrm.h "
#include " DreamView.h "
程序编译没问题,但运行到GetActiveView();就出错。
解决办法:
方法:在框架函数(开启新线程处)这样处理:
-
C/C++ code
m_dreamView = GetActiveView();
pcwinthread = AfxBeginThread(ListeningThread,m_dreamView, 0 , 0 , 0 );
在新线程里: C/C++ code
CDreamView * pDreamView = (CDreamView * )lpvoid; // 测试了下,似乎没什么问题
C/C++ code
BOOL CObject::IsKindOf(const CRuntimeClass* pClass) const
{
ASSERT(this != NULL);
// it better be in valid memory, at least for CObject size
ASSERT(AfxIsValidAddress(this, sizeof(CObject)));
// simple SI case
CRuntimeClass* pClassThis = GetRuntimeClass();//黄色箭头指向这句。。。。
return pClassThis->IsDerivedFrom(pClass);
}
最后
以上就是精明大米为你收集整理的在DOc的构造函数中得到VIew类指针引起的问题(GetActiveView()引起的Access Violation;this->GetFirstViewPosition()=NULL;ASSERT(AfxIsValidAddress(this, siz的全部内容,希望文章能够帮你解决在DOc的构造函数中得到VIew类指针引起的问题(GetActiveView()引起的Access Violation;this->GetFirstViewPosition()=NULL;ASSERT(AfxIsValidAddress(this, siz所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复