call stack message as below : CrtDbgReport(int 0x00000002, const char * 0x5f4cd6dc THIS_FILE, int 0x0000004c, const char * 0x00000000, const char * 0x00000000) line 299 AfxAssertFailedLine(const char * 0x5f4cd6dc THIS_FILE, int 0x0000004c) line 39 + 20 bytes CWnd::GetDlgItem(int 0x00000096) line 76 + 29 bytes CMechanism::cd_analyze_data() line 252 + 24 bytes CMechanism::On_rev_i2c_data(unsigned char 0x05, unsigned int 0x00000004) line 443 + 8 bytes CMechanism::mechanism_heart() line 125 CLCDDlg::OnTimer(unsigned int 0x0000001e) line 1444 CWnd::OnWndMsg(unsigned int 0x00000113, unsigned int 0x0000001e, long 0x00000000, long * 0x0012cf4c) line 1829 CWnd::WindowProc(unsigned int 0x00000113, unsigned int 0x0000001e, long 0x00000000) line 1585 + 30 bytes AfxCallWndProc(CWnd * 0x0012d238 {CLCDDlg hWnd=???}, HWND__ * 0x008407aa, unsigned int 0x00000113, unsigned int 0x0000001e, long 0x00000000) line 215 + 26 bytes AfxWndProc(HWND__ * 0x008407aa, unsigned int 0x00000113, unsigned int 0x0000001e, long 0x00000000) line 368 AfxWndProcBase(HWND__ * 0x008407aa, unsigned int 0x00000113, unsigned int 0x0000001e, long 0x00000000) line 220 + 21 bytes
这种级联表达式是很恐怖的,你怎么知道它肯定能返回一个合法的指针给你?
CWnd *pWnd = GetDlgItem(IDD_TABPAGE3);
if( pWnd && pWnd->m_hWnd )
{
XXXXXX
}
if (pWnd && pWnd->IsWindow())
pWnd->SendMessage(WM_MECH_BASIC_INFO, 0 ,0);
SendMessage 对于 hWnd 的处理都是没问题的问题主要是在 消息处理函数上,另外 可以尝试 PostMessage 也许会没事SendMessage 是实时处理消息的
PostMessage 是异步处理消息的如果不是必须, 应该优先使用PostMessage
//{{AFX_MSG(CMyTabPage3)
virtual BOOL OnInitDialog();
afx_msg void InitMechBaiscInfor(UINT wParam,LONG lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()ON_MESSAGE(WM_MECH_BASIC_INFO, InitMechBaiscInfor)void CMyTabPage3::InitMechBaiscInfor(UINT wParam,LONG lParam)
{ UCHAR i, item;
UCHAR content[5]; }
CWnd *pWnd = GetDlgItem(IDD_TABPAGE3);
if( pWnd && pWnd->m_hWnd && IsWindow( pWnd->m_hWnd ) )
{
...
}
if( pWnd && pWnd->GetSafeHwnd())
{
...
}
afx_msg LRESULT InitMechBaiscInfor(WPARAM wpara,LPARAM lParam); 这个~我之前定义自己的消息类只能这样~
否则编译提示出错~?
是void ,WPARAM/LPARAM 都用过了, 但还是不行, 哪位能指点一下??
1. GetDlgItem(IDD_TABPAGE3)->m_hWnd //确保可行
2. WM_MECH_BASIC_INFO //确保>WM_USER,且没有重复
3. 接收WM_MECH_BASIC_INFO消息的消息函数,是否正常
我按照下面的方法检测了, 可还是不行?
CWnd *pWnd = GetDlgItem(IDD_TABPAGE3);
if( pWnd && pWnd->m_hWnd && IsWindow( pWnd->m_hWnd ) )
{
...
}
不能调试一下看看消息响应函数中执行是否异常?
或者看一下Call Stack中异常停在哪里?这样才能确认到底是什么原因
CrtDbgReport(int 0x00000002, const char * 0x5f4cd6dc THIS_FILE, int 0x0000004c, const char * 0x00000000, const char * 0x00000000) line 299
AfxAssertFailedLine(const char * 0x5f4cd6dc THIS_FILE, int 0x0000004c) line 39 + 20 bytes
CWnd::GetDlgItem(int 0x00000096) line 76 + 29 bytes
CMechanism::cd_analyze_data() line 252 + 24 bytes
CMechanism::On_rev_i2c_data(unsigned char 0x05, unsigned int 0x00000004) line 443 + 8 bytes
CMechanism::mechanism_heart() line 125
CLCDDlg::OnTimer(unsigned int 0x0000001e) line 1444
CWnd::OnWndMsg(unsigned int 0x00000113, unsigned int 0x0000001e, long 0x00000000, long * 0x0012cf4c) line 1829
CWnd::WindowProc(unsigned int 0x00000113, unsigned int 0x0000001e, long 0x00000000) line 1585 + 30 bytes
AfxCallWndProc(CWnd * 0x0012d238 {CLCDDlg hWnd=???}, HWND__ * 0x008407aa, unsigned int 0x00000113, unsigned int 0x0000001e, long 0x00000000) line 215 + 26 bytes
AfxWndProc(HWND__ * 0x008407aa, unsigned int 0x00000113, unsigned int 0x0000001e, long 0x00000000) line 368
AfxWndProcBase(HWND__ * 0x008407aa, unsigned int 0x00000113, unsigned int 0x0000001e, long 0x00000000) line 220 + 21 bytes
检查一下此处GetDlgItem,看是否有问题?
没有程序,也不能帮你什么。
消息响应函数的参数要写好,如果以上没有问题,那么问题应该就出来消息响应函数上面。
注意参数(WPARAM wpara,LPARAM lParam)和返回值。
没有参数也编译得出来,但是问题会不少
这里也出错CWnd *pWnd = GetDlgItem(IDD_TABPAGE3); 看来问题好像是句柄没得到, 但我怎么才能得到这个句柄
CWnd *pWnd = GetDlgItem(IDD_TABPAGE3);
if( pWnd && pWnd->GetSafeHwnd())
{
::SendMessage(GetDlgItem(IDD_TABPAGE3)->m_hWnd , WM_MECH_BASIC_INFO, 0 ,0);
}
点击的按钮应该在包含IDD_TABPAGE3的对话框上,看一下是不是按钮在子对话框上
{
//这个地方打断点调试
...
如果是:先 FindWindow,在用GetDlgItem()在FindWindow返回的hwnd,中找,在sendmessage
GetDlgItem(IDD_TABPAGE3),这种调用方式说明this指针作为父窗口,你这里的this指针是CMechanism对象,所以GetDlgItem这个函数执行就异常了。昨天我说了,换一个思路,你是要给IDD_TABPAGE3这个窗口发消息,你可以在IDD_TABPAGE3窗口创建后,将其句柄保存起来,然后通过正确的方法传到这里。
SendMessage不进消息队列直接呼叫窗口过程
if(hWnd == NULL)
return GetLastError();
if(IsWindow(hWnd))
{
::SendMessage(hWnd,WM_MECH_BASIC_INFO,0,0);
}
然后把断点设置在WM_MECH_BASIC_INFO消息处理那个函数上查看是否该函数有违规操作。
CWnd* CWnd::GetDlgItem(int nID) const
{
ASSERT(::IsWindow(m_hWnd)); <<<<------这行出错
if (m_pCtrlCont == NULL)
return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID));
else
return m_pCtrlCont->GetDlgItem(nID);
}GetDlgItem(IDD_TABPAGE3)就出错了,你在哪里调用的SendMessage?调用的时候都还不是有效窗口,仔细查查吧。