我是靠谱客的博主 精明大米,最近开发中收集的这篇文章主要介绍在DOc的构造函数中得到VIew类指针引起的问题(GetActiveView()引起的Access Violation;this->GetFirstViewPosition()=NULL;ASSERT(AfxIsValidAddress(this, siz,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

原因分析:

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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部