环境:EVC++3.0
1.用SOCKET的API写了一个类声明为全局类的静态成员,并为该类定义了回调函数ONSockRead在接收数据时调用
2.在窗口DlgLogin中定义了静态成员函数OnRead,并将OnRead赋给回调函数ONSockRead以在窗口中接收数据
3.DlgLogin的OnRead函数接收到SOCKET数据时执行DlgMain.DoModal()调出另一窗口时运行时出错:"Assertion Failed!  :File wincore.cpp Line 1042"
求解决方法或思路

解决方案 »

  1.   

    File wincore.cpp Line 1042把这里的代码贴出来看看
      

  2.   

    void CWnd::AssertValid() const
    {
    if (m_hWnd == NULL)
    return;     // null (unattached) windows are valid // check for special wnd??? values
    ASSERT(HWND_TOP == NULL);       // same as desktop
    if (m_hWnd == HWND_BOTTOM)
    ASSERT(this == &CWnd::wndBottom);
    else if (m_hWnd == HWND_TOPMOST)
    ASSERT(this == &CWnd::wndTopMost);
    else if (m_hWnd == HWND_NOTOPMOST)
    ASSERT(this == &CWnd::wndNoTopMost);
    else
    {
    // should be a normal window
    ASSERT(::IsWindow(m_hWnd)); // should also be in the permanent or temporary handle map
    CHandleMap* pMap = afxMapHWND();
    ASSERT(pMap != NULL); CObject* p;
    1042行 ASSERT((p = pMap->LookupPermanent(m_hWnd)) != NULL ||
    (p = pMap->LookupTemporary(m_hWnd)) != NULL);
    1043行 ASSERT((CWnd*)p == this);   // must be us
    }
    }
      

  3.   

    一定错,而且不关File wincore.cpp 的事。因为ONSockRead是在socket线程里面,DoModal()会把线程停住了,所以会出错。应该在ONSockRead里面发送一个消息,然后在消息里用DoModal(),最好还是Create。
      

  4.   

    void CALLBACK CAsiaatum_QCDlg::OnRead(CWnd *pWnd, const char* buf, int len)
    {

    CAsiaatum_QCDlg *dlg = (CAsiaatum_QCDlg *)pWnd; if (strncmp(buf, "[LOGIN:OK][1]", 13) == 0)
    {
    dlg->PostMessage(WM_LOGIN, 1, 0);
    dlg->m_ctrl_login.EnableWindow(FALSE);
    }
    else if (strncmp(buf, "[LOGIN:OK][2]", 13) == 0)
    {
    dlg->PostMessage(WM_LOGIN, 2, 0);
    dlg->m_ctrl_login.EnableWindow(FALSE);
    }
    }LRESULT CAsiaatum_QCDlg::OnLogin(WPARAM wParam, LPARAM lParam)
    {
    if ((int)wParam == 1)
    {
    AfxGetMainWnd()->SetWindowText(_T("不良记录(质检)"));
    QCDlg = new CCheckQC(NULL);
    QCDlg->Create(IDD_CHECKQC, NULL);
    QCDlg->ShowWindow(SW_SHOW);

    }
             else if (...)
             {
                      ...
             }
    }
      

  5.   

    to  niying(逆颖) :用了ONSockRead里面发送消息的方式,但Domodal出来的窗口收不到消息,Create窗口的方式还没试先试试