组件A,实现接口Call。A::Call{
   Fire_call();    // 发出事件
}当定时器调用a->call时,客户端没有响应
但当客户端主动调用a->call时,客户端有相应。以上问题同链接(http://bbs.csdn.net/topics/260083360)是同一个问题,按照方法修改后, 客户端还是接收 不到定时器调用触发的消息。
 

解决方案 »

  1.   


    STDMETHODIMP CBabyE::test(BSTR str1, BSTR s2)
    {
    AFX_MANAGE_STATE(AfxGetAppModuleState());
    m_idTimer = ::SetTimer( NULL, 0, 10, TimerProc );//启动定时器
    g_pDispConnect = this; return S_OK;
    }
    void static CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime )
    {
    HRESULT hRes = CoInitializeEx(NULL,COINIT_MULTITHREADED);
    // CBabyE* pDispConnect = new CBabyE();
    ::KillTimer(NULL,g_pDispConnect->m_idTimer); //g_pDispConnect->test(_bstr_t("OnClickedSink4_p1"),_bstr_t("OnClickedSink4_p1"));
    g_pDispConnect->Fire_Result( _bstr_t("OnClickedSink4_p1")); //再定时器里面调用触发函数
    ::CoUninitialize();
    return;
    }
      

  2.   

    定时器依托于窗体,传NULL表观上看应该是有桌面创建,还真不好评判是否成功了
      

  3.   

    以上问题,都是我单步跟踪的时候出现的,直接运行脚本就可以接受到的。可能是消息在单步跟踪的时候被延迟导致,如果直接运行客户端接收组建外线程一切正常。但现在有个新问题,就是客户端注销连接的时候出现异常,Unadvise返回的时候弹出“Debug Assertion Failed!"
    STDMETHODIMP IConnectionPointImplMT<T, piid, CDV>::Unadvise(DWORD dwCookie)
    {
     m_CPMTCritSec.Lock();
     
        //DWORD dwGITCookie = (DWORD)_CDV::GetUnknown(dwCookie);    DWORD dwGITCookie = (DWORD)m_vec.GetUnknown(dwCookie); HRESULT hRes = m_vec.Remove(dwCookie) ? S_OK : CONNECT_E_NOCONNECTION;
     m_CPMTCritSec.Unlock();
     if (hRes == S_OK && dwGITCookie != NULL)
     {
      hRes = m_pGIT->RevokeInterfaceFromGlobal(dwGITCookie);
     } return hRes;
    }