运行到下面的语句就报告错误?
::SendMessage(GetDlgItem(IDD_TABPAGE3)->m_hWnd , WM_MECH_BASIC_INFO, 0 ,0);

解决方案 »

  1.   

    估计是这的问题GetDlgItem(IDD_TABPAGE3),IDD_TABPAGE3是否在你那个发消息的窗口上?
      

  2.   

    GetDlgItem(IDD_TABPAGE3)->m_hWnd 
    这种级联表达式是很恐怖的,你怎么知道它肯定能返回一个合法的指针给你?
      

  3.   

    使用前先判断下
    CWnd *pWnd = GetDlgItem(IDD_TABPAGE3);
    if( pWnd && pWnd->m_hWnd ) 
    {
     XXXXXX
    }
      

  4.   

    CWnd *pWnd = GetDlgItem(IDD_TABPAGE3);
    if (pWnd && pWnd->IsWindow())
      pWnd->SendMessage(WM_MECH_BASIC_INFO, 0 ,0);
      

  5.   

    不管 hWnd 是什么
    SendMessage 对于 hWnd 的处理都是没问题的问题主要是在 消息处理函数上,另外 可以尝试 PostMessage 也许会没事SendMessage 是实时处理消息的
    PostMessage 是异步处理消息的如果不是必须, 应该优先使用PostMessage
      

  6.   

    我的消息处理函数声名和定义如下, 有错误吗? protected: // Generated message map functions
    //{{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]; }
      

  7.   

    是不是窗口没有出来
    CWnd *pWnd = GetDlgItem(IDD_TABPAGE3); 
    if( pWnd && pWnd->m_hWnd && IsWindow( pWnd->m_hWnd ) ) 
    {
        ...
    }
      

  8.   

    因该是GetDlgItem(IDD_TABPAGE3)没有成功CWnd *pWnd = GetDlgItem(IDD_TABPAGE3);
    if( pWnd && pWnd->GetSafeHwnd()) 

        ... 
    }
      

  9.   

    InitMechBaiscInfor这个消息响应函数的返回值到底是void还是LRESULT?参数类型用WPARAM/LPARAM似乎更合适一点
      

  10.   

    public:
    afx_msg LRESULT InitMechBaiscInfor(WPARAM wpara,LPARAM lParam); 这个~我之前定义自己的消息类只能这样~
    否则编译提示出错~?
      

  11.   


    是void ,WPARAM/LPARAM 都用过了, 但还是不行, 哪位能指点一下??
      

  12.   

    我这个窗口是在一个对话框里.  加的一个小对话框, 不知道这样能不能接收? 具体就是,一个大的对话框 放上一个tablist,  左半边是大对话框的部分, 右半边是一个tablist 我这个对话框放在tablist上面. (注意:左半边的对话框这个时候也是可以用的) 
      

  13.   

        你为什么不用IDD_TABPAGE3的gethandle,然后再这运行呢
      

  14.   

    检测三个地方
    1. GetDlgItem(IDD_TABPAGE3)->m_hWnd  //确保可行
    2. WM_MECH_BASIC_INFO //确保>WM_USER,且没有重复
    3. 接收WM_MECH_BASIC_INFO消息的消息函数,是否正常
      

  15.   

    楼上的说的有理 就这几个地方返回类型用 LRESULT 也没事啊。
      

  16.   

    应该是你的窗口m_hWnd已经为空了,可是你却指向他,执行消息处理,当然就不对喽
      

  17.   


    我按照下面的方法检测了, 可还是不行?
    CWnd *pWnd = GetDlgItem(IDD_TABPAGE3); 
    if( pWnd && pWnd->m_hWnd && IsWindow( pWnd->m_hWnd ) ) 

        ... 
    }
      

  18.   

    SendMessage要等到消息响应函数执行完毕了才返回。
    不能调试一下看看消息响应函数中执行是否异常?
    或者看一下Call Stack中异常停在哪里?这样才能确认到底是什么原因
      

  19.   

    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
      

  20.   

    CMechanism::cd_analyze_data()中,执行了GetDlgItem函数么?
    检查一下此处GetDlgItem,看是否有问题?
    没有程序,也不能帮你什么。
      

  21.   


    消息响应函数的参数要写好,如果以上没有问题,那么问题应该就出来消息响应函数上面。
    注意参数(WPARAM wpara,LPARAM lParam)和返回值。
    没有参数也编译得出来,但是问题会不少
      

  22.   

    你这个问题应该是响应WM_MECH_BASIC_INFO消息的代码出了问题,在这个消息里打断点调试吧。
      

  23.   

    我设置了断点到这里::SendMessage(GetDlgItem(IDD_TABPAGE3)->m_hWnd , WM_MECH_BASIC_INFO, 0 ,0);就出错了
      

  24.   


    这里也出错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);
    }
      

  25.   

    CWnd *pWnd = GetDlgItem(IDD_TABPAGE3); IDD_TABPAGE3这个是什么窗口?是否已经创建?
      

  26.   

    看一下GetDlgItem(IDD_TABPAGE3)->m_hWnd 是否在使用前被正确的初始化了
    点击的按钮应该在包含IDD_TABPAGE3的对话框上,看一下是不是按钮在子对话框上
      

  27.   

    关键不在这里,是在处理WM_MECH_BASIC_INFO消息的地方打断点,ON_MESSAGE(WM_MECH_BASIC_INFO, InitMechBaiscInfor) void CMyTabPage3::InitMechBaiscInfor(UINT  wParam,LONG  lParam) 
    {
    //这个地方打断点调试
    ...
      

  28.   

    程序是先执行::SendMessage(GetDlgItem(IDD_TABPAGE3)->m_hWnd , WM_MECH_BASIC_INFO, 0 ,0);再执行void CMyTabPage3::InitMechBaiscInfor(UINT  wParam,LONG  lParam) 的,所以打也到不了~,~
      

  29.   

    IDD_TABPAGE3是不是不在同个dlg下了
    如果是:先 FindWindow,在用GetDlgItem()在FindWindow返回的hwnd,中找,在sendmessage
      

  30.   

    在API中,GetDlgItem的第一个参数是父窗口,该函数是获得子窗口的句柄。
    GetDlgItem(IDD_TABPAGE3),这种调用方式说明this指针作为父窗口,你这里的this指针是CMechanism对象,所以GetDlgItem这个函数执行就异常了。昨天我说了,换一个思路,你是要给IDD_TABPAGE3这个窗口发消息,你可以在IDD_TABPAGE3窗口创建后,将其句柄保存起来,然后通过正确的方法传到这里。
      

  31.   

    PostMessage试试.
    SendMessage不进消息队列直接呼叫窗口过程
      

  32.   

    试过了吗?正常情况下,SendMessage会等InitMechBaiscInfor执行完毕才返回,如果断点到不了的话,就是hWnd出问题了。
      

  33.   

    HWND hWnd = ::GetDlgItem(m_hWnd,IDD_TABPAGE3);
    if(hWnd == NULL)
     return GetLastError();
    if(IsWindow(hWnd))
    {
     ::SendMessage(hWnd,WM_MECH_BASIC_INFO,0,0);
    }
    然后把断点设置在WM_MECH_BASIC_INFO消息处理那个函数上查看是否该函数有违规操作。
      

  34.   

    看了下你截的图,winocc.cpp,76行内容如下:
    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?调用的时候都还不是有效窗口,仔细查查吧。