我是COM初学者,这个问题我搞了好几天都没解决!
我做了一个进程外的(就在本机运行,用MFC做)可连接对象的例子,这个例子就是按照潘爱民的《COM原理与应用》的第六章那个例子做的,只是他做的是个进程内的,我做的是个进程外的。程序编译是通过了,可运行得不到正确结果!我调了程序,发现是在客户端调用advise时出了错(这前面调用FindConnectionPoint等,hr都是返回S_OK)。请各位高手指点一下!最好是哪位高手有个可连接对象(MFC做的,进程外的)小例子,发给我看一下!请大家帮帮我吧!

解决方案 »

  1.   

    /////////////////
    IApplicationPtr pApp;
    ISessionsPtr pSessions;
    ISessionPtr pSession;
    CAppEvents *m_pAppEvents;
    CSessionEvents *m_pSessionEvents;         m_pAppEvents=new CAppEvents ;
             m_pSessionEvents=new CSessionEvents ;
    ///////////////////
    HRESULT hr;
    try{
    pUnkSink = m_pAppEvents->GetIDispatch(FALSE);   //Establish a connection between source and sink. //m_pUnkSrc is IUnknown of server obtained by CoCreateInstance().
    //m_dwCookie is a cookie identifying the connection, and is needed
    //to terminate the connection.
    m_dwCookie=0;
    int ret=AfxConnectionAdvise(pApp, DIID__IApplicationEvents, 
    pUnkSink, FALSE,&m_dwCookie); 
    hr=pApp->Connect(0,"1","1","1");
    if(FAILED(hr)) _com_raise_error(hr);
    pSessions=pApp->GetSessions();
    VARIANT var;
    VariantInit(&var);
    var.vt=VT_I4;
    var.lVal=m_iSessionNum;
    long i=pSessions->Count();
    pSession=pSessions->Item(var);
    /////////
         pSessionUnkSink =0;
    pSessionUnkSink=m_pSessionEvents->GetIDispatch(FALSE);   //Establish a connection between source and sink.
    ASSERT(pSessionUnkSink);
    m_dwSessionCookie=0;
    ret=AfxConnectionAdvise(pSession , DIID__ISessionEvents, 
    pSessionUnkSink, FALSE,&m_dwSessionCookie);
    /////////
    VariantClear(&var);
    PostThreadMessage(WM_QUEUE,0,0);
    }catch(_com_error &e)
    {
    AfxMessageBox((char*)e.Description());
    }