在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);
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值