阴魂不散的user breakpoint called from code at 0x7c92120e
首先说一下,这个问题已经跟着我几个月,一直解决不了。
AfxWndProc(HWND__ * 0x000204d6, unsigned int 275, unsigned int 1, long 0) line 375 + 30 bytes
AfxWndProcBase(HWND__ * 0x000204d6, unsigned int 275, unsigned int 1, long 0) line 220 + 21 bytes
USER32! 77d18734()
USER32! 77d18816()
USER32! 77d189cd()
USER32! 77d18a10()
USER32! 77d27721()
USER32! 77d249c4()
USER32! 77d3a956()
USER32! 77d3a2bc()
USER32! 77d663fd()
USER32! 77d664a2()
USER32! 77d50877()
USER32! 77d5082f()
__crtMessageBoxA(const char * 0x00123834, const char * 0x102579a0 `string', unsigned int 73746) line 65
CrtMessageWindow(int 2, const char * 0x5f4d0cf0 THIS_FILE, const char * 0x00124968, const char * 0x00000000, const char * 0x0012698c) line 520 + 22 bytes
_CrtDbgReport(int 2, const char * 0x5f4d0cf0 THIS_FILE, int 313, const char * 0x00000000, const char * 0x00000000) line 419 + 76 bytes
AfxAssertFailedLine(const char * 0x5f4d0cf0 THIS_FILE, int 313) line 39 + 20 bytes
CWnd::FromHandlePermanent(HWND__ * 0x000204d6) line 313 + 32 bytes
CWnd::WalkPreTranslateTree(HWND__ * 0x00020540, tagMSG * 0x00465b18 {msg=0x00000113 wp=0x00000002 lp=0x00000000}) line 2674 + 9 bytes
CWinThread::PreTranslateMessage(tagMSG * 0x00465b18 {msg=0x00000113 wp=0x00000002 lp=0x00000000}) line 672 + 18 bytes
CWinThread::PumpMessage() line 848 + 30 bytes
CWnd::RunModalLoop(unsigned long 4) line 3489 + 19 bytes
CDialog::DoModal() line 539 + 12 bytes
CtoolbbApp::InitInstance() line 82 + 11 bytes
AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x001423a6, int 1) line 39 + 11 bytes
WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x001423a6, int 1) line 30
WinMainCRTStartup() line 330 + 54 bytes
KERNEL32! 7c817077()
下面是坛友的热心指点:
(1)lazy_2010的指点,
应该是你的 WM_TIMER 消息处理的时候,发现错误了,即
AfxWndProc(, 275, ); 的代码,那里比较重要,下面分析看看是什么错误信息。
275 = 0x0113,即 WM_TIMER。
从 AfxWndProc 的代码来看,有两个 ASSERT
C/C++ code
CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
ASSERT(pWnd != NULL);
ASSERT(pWnd->m_hWnd == hWnd);
估计是你的 window (HWND)已经无效了?
想办法输出创建的窗口的 HWND,然后在出现问题的时候看看是哪个窗口,再考虑这个窗口或者它的父窗口是否对应的 CWnd 对象的函数处理存在问题吧。
注意:我已经输出了,找到了是哪个窗口的问题了,但是下一步不知道怎么做了?
我用到了PropertySheet ,
m_tab.InsertItem(1,_T("WI"));
m_wiboo.Create(IDD_DIALOG_WI,&m_tab);
我在出错的那个窗口的WM_TIMER消息中的代码是这样的:
void CReadText::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
TCHAR buf0[50],buf1[50];
memset(buf0,0,sizeof(buf0));
memset(buf1,0,sizeof(buf1));
SYSTEMTIME st;
::GetLocalTime(&st);
sprintf(buf0,"%2d%2d%2d",st.wHour,st.wMinute,st.wSecond);
if((int)process_hand==0xcccccccc)
return;
if (nIDEvent==1)
{
TCHAR popWiTeBuf[255];
memset(popWiTeBuf,0,sizeof(popWiTeBuf));
if(((CloveApp *)AfxGetApp())->g_ifDecideWindow==0)
{
this->GetDlgItem(IDC_POINT)->SetWindowText("第一手资料表示0");
}
if (((CloveApp *)AfxGetApp())->g_ifDecideWindow==2)
{
sprintf(popWiTeBuf,"第一手%d//第二手%d",m_IDCstartNum,m_IDCingNum);
this->GetDlgItem(IDC_POINT)->SetWindowText(popWiTeBuf);
}
int studentNum=0;
studentNum=CRapTed::m_stuPtrArray.GetSize();
TCHAR buf[50];
memset(buf,0,sizeof(buf));
sprintf(buf,"管理学籍:%d",studentNum);
this->GetDlgItem(IDC_TAKECAREOF_PLANT)->SetWindowText(buf);
}
if (nIDEvent==2)
{
if(m_boolList)
{
int nowadaySayBase=0x7ff920;
TCHAR newstumaxBuf[255];
memset(newstumaxBuf,0,sizeof(newstumaxBuf));
::ReadProcessMemory(process_hand,(LPVOID)nowadaySayBase,newstumaxBuf,100,0);
this->GetDlgItem(IDC_NOWADAY_TEXT)->SetWindowText(newstumaxBuf);
int num=0;
bool goRead=0;
int nHeadNum=m_list.GetItemCount();
int textNum=0;
for(int i=0;i<100;i++)
{
if(strlen(m_readTextStrBuf[i])>2)
textNum++;
}
TCHAR strBuf[255];
memset(strBuf,0,sizeof(strBuf));
sprintf(strBuf,"Array总数:%d添加的学籍编号:%d,将要添加的学籍编号:%d",textNum,m_realTextNum-1,m_indexNum);
this->GetDlgItem(IDC_TEXTARRAY_NUM)->SetWindowText(strBuf);
}
}
CDialog::OnTimer(nIDEvent);
}
(2)arong1234的指点
你程序里有SetTimer(1 ....)之类得代码么?如果有,对应得消息处理函数是怎样得?
两位达人都这样说了,跟timer有关系,我就都贴出来了。
请大家看看我的问题究竟出在哪里?
我的分数不多了,就65分了,结贴之前我会追加分数的。谢谢啦!