none
对话款无故不能为read,终止关闭 RRS feed

  • 问题

  • 请问高手们:

    我在A对话框的edit中显示内容,并传递给B类m_execmd.m_pFprint = this;在B类(该类是由CStatic类派生的)中,用了如下的函数
    if(m_pFprint != NULL)
    {
     CWnd *pWnd = m_pFprint->GetDlgItem(ID_FPT_TEXT_RESULT);
     CString str;
     pWnd->GetWindowText(str);
     str += m_strReturn;
     pWnd->SetWindowText(str);
     m_pFprint = NULL;
    }
    当在A中的edit中显示了一些内容之后,关闭A,再打开C对话框(其中C对话框中需要根据条件执行上面的一段代码),但是不知道为什么,打开C之后,就会出现不能为read的终止对话框,

    也就是上面一段代码在A对话框中执行的话,在C中打开就会错误,但是如果在A中不执行,那么打开C对话框就会没有错误,请问为什么?

     

    2010年4月9日 13:39

答案

  • 0xCCCCCCCC这个错误是你使用了没有初始化的指针,比如如下情况:

    RECT* p;

    p->nWidth = 10;这样,在这句话就会报如上错误。

    这个错误并不一定是你所说的那两个指针,你把那两个去掉看看还有没有错?先定位问题的位置。


    0xBAADF00D
    • 已标记为答案 神秘人 2010年4月12日 2:00
    2010年4月11日 5:25
    版主

全部回复

  • 这个错误多是无效的指针导致,你需要检查代码中使用指针的地方如pWnd等,看看他们是不是在使用前就被释放了,或者是空指针.
    0xBAADF00D
    2010年4月9日 15:15
    版主
  • 非常感谢版主的回答,我根据版主的提示,又但不跟踪调试了一下,没有发现什么错误。我在这个B类中只定义了两个指针,一个是B类的公共成员变量CClassA *m_pFprint初始化为NULL, 然后,pWnd就如上所述,是局部的,我又在m_pFprint=NULL;前面加了pWnd=NULL;但是还是出现打开C对话框时候的错误

    请版主再给详细说明一下,我确实不知道如何是好了,谢谢了

    2010年4月10日 0:45
  • 你可以把报错内容提供一下,一般形如0xC0000005访问XXXXXXX不能为读,这个XXXXXXX对定位问题是很重要的。

    检查pWnd或者其他指针会不会在中途调用中就被释放。

    如果还不行,把所有指针的使用的地方想办法替换掉,再看看问题。

    CWnd *pWnd = m_pFprint->GetDlgItem(ID_FPT_TEXT_RESULT);

    下面加个检查if(NULL == pWnd)::MessageBox(0,0,0,0);


    0xBAADF00D
    2010年4月10日 12:44
    版主
  • 我把上面的那一个if语句体给注释掉了,但是错误还是偶尔会出错误,但是不管错误有没有,都会是错误码为2. 错误为“0x5f42d93f"指令引用的"0xccccccc0"内存。该内存不能为read。

    单击确定后,有Debug Assertion Failed!

    File:wincore.cpp   Line:991

    不知道什么意思,错误的时候,都是这些一样的信息和错误码

    2010年4月11日 0:59
  • 0xCCCCCCCC这个错误是你使用了没有初始化的指针,比如如下情况:

    RECT* p;

    p->nWidth = 10;这样,在这句话就会报如上错误。

    这个错误并不一定是你所说的那两个指针,你把那两个去掉看看还有没有错?先定位问题的位置。


    0xBAADF00D
    • 已标记为答案 神秘人 2010年4月12日 2:00
    2010年4月11日 5:25
    版主
  • 非常谢谢Vonger版主的再次回答。

       根据版主的提示,我对该类的所有涉及到指针的变量都赋了初始值,但还是出现那样的问题。我对线程执行函数的指针进行了断言,结果它为NULL, 下面是涉及到线程的一些函数。

     m_pThread = AfxBeginThread(ComProc, (LPVOID)this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL);//在CExecmd这个类当中
      if(m_pThread == NULL)
      {
             CloseHandle(m_hCom);
             AfxMessageBox("Ï̴߳´½¨Ê§°Ü");
             m_gIsPortOpen = FALSE;
            return FALSE;
      }
      else
      {
            m_pThread->ResumeThread();
      }


    UINT ComProc(LPVOID pParam)  //全局函数
    {
     DWORD lErrors;
     DWORD dwMask,dwTrans;
     COMSTAT comstat;
     CExecmd *pExecmd = (CExecmd *)pParam;
     
     ASSERT(pExecmd == NULL);

     if(pExecmd == NULL)
          return 1;

     memset(&ol, 0, sizeof(OVERLAPPED));
     ol.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
     if(ol.hEvent == NULL)
     {
          AfxMessageBox("事件创建失败");
          return (UINT)-1;
     }
     
     while(m_gIsPortOpen)
     {   
          ClearCommError(m_hCom, &lErrors, &comstat);
         if(comstat.cbInQue)
         {
              pExecmd->OnProcessRead();
          }
          dwMask = 0;
      
         if(!WaitCommEvent(m_hCom, &dwMask, &ol))
        {
             if(GetLastError() == ERROR_IO_PENDING)
            {   
                 GetOverlappedResult(m_hCom, &ol, &dwTrans, TRUE);
             }
           else
          {
               CloseHandle(ol.hEvent);
              return (UINT)-1;
          }
        }
     }
      CloseHandle(ol.hEvent);

     return 0;
    }

    断言每次都为TRUE,但是下面的 pExecmd->OnProcessRead();却可以调用。我于是做了一个实验,仍然在ComProc(LPVOID pParam)中,如下

    if(pExecmd != NULL)

    {

          ASSERT(pExecmd ==NULL);

         AfxMessageBox("ppppp1");

    }

    AfxMessageBox("ppppp2");

    结果是pppp2没有出现一次,而断言却是每次都为TRUE。不明白为什么,我想可能我的问题就在这个地方。

    请版主帮助分析一下原因,先谢谢了
    2010年4月11日 13:40
  • 不要把控件句柄传到其他线程中使用。类似COM的线程模型,MFC对于每个线程的资源都有保护。信息存放在TLS中。

    如果需要跨进程控制窗口,需要通过消息机制,向创建窗口的线程PostMessage


    麻烦把正确答案设为解答。
    2010年4月12日 1:34
    版主