本人做了一个单文档界面的程序,自定义了一个新类CDlgBar(基于CDialogBar),映射了一个成员函数(当然也是在CDlgBar里头),在这个函数中需要调用CXXXDoc类里的某些变量。于是我在CDlgBar里定义了一个CXXXDoc对象,通过CDlgBar来调用这个变量。虽编译成功,但运行时出错。不知是不是CDialogBar类不能这样用,还是其他的什么原因?望高手指点迷津!

解决方案 »

  1.   

    “于是我在CDlgBar里定义了一个CXXXDoc对象”,这个变量并没有代表你的文档对象,二十亿个新的对象,调用他的一些方法可能出错,因为没有初始化。
    可以用AfxGetMainWnd()->GetActiveDocument()来得到程序的文档指针。
      

  2.   

    楼上的方法好像行不通。
    首先AfxGetMainWnd()返回CWnd*,而CWnd中无GetActiveDocument(),但他的继承类CMDIFrameWnd中有,所以须强制转换为CMainFrame(CMainFrame继承于CMDIFrameWnd)
    我是这样调试的:  CAaDoc* pDoc=(CAaDoc*)((CMainFrame*)AfxGetMainWnd())->GetActiveDocument();
      pDoc->m_nVal=1;//m_nVal 为在CAaDoc中添加的共有变量调试中发现
      第一句可以执行,但第二句报错 “违反权限”
      跟踪发现第一句执行完后pDoc的值为NULL
      最后在GetActiveDocument()中发现,当得不到活动视图时,返回NULL
      
       所以,我分析,因为在弹出模态对话框时,无活动视图,所以GetActiveDocument()返回NULL,因而还是得不到文档指针最终我认为,因该在文档类中编写与对话框有关的代码,就不会出现上述问题,MSDN的示例程序也是这样处理的