我在RasDial的回调函数中进行如下处理:VOID WINAPI RasDialFunc(UINT unMsg,  RASCONNSTATE rasconnstate,  DWORD dwError  )
{
char szMessage[256];
CMainFrame *pMainFrame = DYNAMIC_DOWNCAST(CMainFrame, AfxGetApp()->m_pMainWnd);
if (pMainFrame == NULL || !pMainFrame->IsKindOf(RUNTIME_CLASS(CMainFrame)))
return; CStatusBar *pStatus = (CStatusBar *)pMainFrame->GetStatusBar();

LoadString(::AfxGetApp()->m_hInstance,GetRasConnState((RASCONNSTATE)rasconnstate ),
szMessage, 64 );
// if (pStatus)
// {
// pStatus->SetPaneText(3,  szMessage);
// } if (dwError)  // 发 生 错 误
{
if ( RasGetErrorString( (UINT)dwError, szMessage, 256 ) != 0 )
wsprintf( (LPSTR)szMessage, " 出 错 Undefined RAS Dial Error." );

else if ( RASCS_DONE & rasconnstate ) // 连 接 成 功
{
CChildFrame *pChildFrm = static_cast<CChildFrame*>(pMainFrame->MDIGetActive());
CRasDialMgrView *pRasDialView = pChildFrm->GetTreeView();
if (pRasDialView)
{
pRasDialView->FinishConn(true);
} if (pStatus)
{
// 设置状态栏信息
// pStatus->SetPaneText(3, "连接成功");
}
}}结果发现都出现异常,系统提示m_hwnd不对!我设计时采用MDI结构,并在CChildFrame中进行窗体划分,并定义
GetTreeView()得到CTreeView 类指针,调试时发现指针地址正常,但就是有如下问题:
   1〉
    CStatusBar *pStatus = pMainFrame->GetMessageBar(); 无法得到状态栏对象句柄,后在CMainFrame中实现如下函数:
CStatusBar *GetStatusBar(void)
{ return (::IsWindow(m_wndStatusBar)) ? &m_wndStatusBar : NULL; } 
这时,指针地址对了,
if (pStatus)
{
        pStatus->SetPaneText(3,  szMessage);
}
却还是出现异常,调试发现是因为其m_hwnd = NULL.注释后,在pMainFrame->MDIGetActive()函数调用中依然出错,调试发现得到的子框架为CTempWnd.总体感觉怪怪的!自我猜测,可能按下对话框以后,当前主框架和子窗体对应窗体被释放!看来只能使用消息传递方法了!不知道有人有这方面经验吗?我使用SDI开发却没有一点问题,相关指针都能正常工作!希望各位多多指点,教我如何实现回调函数与相关视图框架类进行交互!

解决方案 »

  1.   

    状态条可以用
    CStatusBar * pStatusBar =
    (CStatusBar*)AfxGetMainWnd()->GetDescendantWindow (AFX_IDW_STATUS_BAR);得到子框架可以用 CMDIChildWnd* pChild =(CMDIChildWnd *)GetActiveFrame();
      

  2.   

    不行的,我就使用这些方法,在SDI下没问题,MDI下调试不行!
      

  3.   

    考虑回调函数中是不是在你用到的窗体已经构造并显示了。可以把对statusbar的操作放在mainframe中,并做一个接口比如,
    BOOL SetStatusInfo(LPCTSTR strInfo); 在回调函数中用mainframe的指针调用即可。同理,将对treectrl的操作视图中,保留相应的操作接口。在回调函数中取得主窗口指针,并判断指针是否有效,否则不要进行响应的操作。
    pMainFrm != NULL && IsWindow(pMainFrm).界面对象指针一般不要在回调函数中保存,因为有些界面对象的句柄可能是临时的。
      

  4.   

    发送消息,委托给CMainFrame处理
      

  5.   

    主要因为MFC的CWnd::FromHandle之类的,包括AfxGetMainWnd之类都与一个ThreadState相关,而异步拔号好像生成了另一线程,而且不是CWinThread.
      

  6.   

    哦,看来是这样的,我跟踪源代码,发现里面会产生CTempWnd,有人知道这东西有什么意义吗?我现在已用消息机制完成了,但有问题无法解决总是不爽!