我在主框架中调用dll,某一处理,动态库中需要往主程序中发送消息 POSITION pos;
pos = m_pListener->m_ptrListReader.GetHeadPosition();
void *ptr = NULL;
while(pos)
{
ptr = NULL;
ptr = m_pListener->m_ptrListReader.GetNext(pos); if(ptr == NULL)
continue; HWND hWnd = (HWND) ptr; if(::IsWindow(hWnd))
{
CWnd *pWnd;
//hWnd = pWnd->GetSafeHwnd();    //CWnd->HWND
pWnd = CWnd::FromHandle(hWnd); //HWND->CWnd PostMessage(hWnd,ID_MSG_TUXEDO_TPSETUNSOL,0,(LPARAM)pMap);
pWnd->PostMessage(ID_MSG_TUXEDO_TPSETUNSOL,0,(LPARAM)pMap); }
}动态库中的某个执行过程是这样的,发消息后,注册窗体收不到消息

解决方案 »

  1.   

    afx_msg LRESULT OnTuxedoMessage(WPARAM wParam, LPARAM lParam);
    ON_MESSAGE(ID_MSG_TUXEDO_TPSETUNSOL, OnTuxedoMessage)
    LRESULT CMainFrame::OnTuxedoMessage(WPARAM wParam, LPARAM lParam)
    {
    MessageBox("Very good!");
    return 0;
    }
      

  2.   

    pWnd不是CMainFrame;
    你应该在dll中发送消息给 CMainFrame,把pMap和ptr作为参数一起发送,
    再由CMainFrame::OnTuxedoMessage发送消息给ptr。
      

  3.   

    我在CMainFrame的OnCreate中加入了 CNetWatcherApp *pApp = (CNetWatcherApp *)AfxGetApp();
    if(pApp != NULL)
    {
    if(pApp->m_pListener != NULL)
    pApp->m_pListener->AddReader(this->GetSafeHwnd());
    }应该就是main的Hwnd啊
      

  4.   

    ID_MSG_TUXEDO_TPSETUNSOL是自己通过RegisterWindowMessage()函数注册的消息吗。dll文件和exe文件都要通过相同的字符串注册。
      

  5.   

    是同一个.h文件
    已经解决了,在框架创建完后注册订阅的,AfxGetMainWnd()->m_hWnd其他的接收不到我在App中initstance里面做的, if(m_pListener != NULL)
    {
    m_pListener->AddReader(AfxGetMainWnd()->m_hWnd);
    }
      

  6.   

    郁闷啊,耗费了我半天
    总结:1、在主框架中,加入消息相应
    afx_msg LRESULT OnTuxedoMessage(WPARAM wParam, LPARAM lParam);
    ON_MESSAGE(ID_MSG_TUXEDO_TPSETUNSOL, OnTuxedoMessage)
    LRESULT CMainFrame::OnTuxedoMessage(WPARAM wParam, LPARAM lParam)
    {
    MessageBox("Very good!");
    return 0;
    }2、调用dll中的函数,加入主框架Hwnd句柄
    3、dll中某函数调用消息
    SendMessage,postMessage都可以,看如何使用了说明:必须使用主框架Hwnd句柄,子框架什么的消息相应不到AfxGetMainWnd()->m_hWnd