1。m_xTBListener是源对象的CConnectionPoint继承对象的实例(BEGIN_CONNECTION_PART宏自动产生的)语句都没有问题。
但是在源对象里调用出接口函数是有问题,源码如下(仿msdn上的):
    const CPtrArray* pConnections = m_xTBListener.GetConnections();
    if (pConnections == NULL) {
AfxMessageBox("回调接口错误!");
return FALSE;
};
    int cConnections = pConnections->GetSize();
    ITBListener* pListener;
    for (int i = 0; i < cConnections; i++)
    {
        pListener = (ITBListener*)(pConnections->GetAt(i));
        ASSERT(pListener != NULL);
        pListener->TB_Transfer(pmsg);
    }
编译没有问题,但是在调用GetConnections函数时,内部的ASSERT(this)出异常。
苦思不得其错,请高手指点。2。MFC下IConnectionPointContainer 接口的实现结构XConnPtContainer没有
FindConnectionPoint函数,我可以在源对象端调用IConnectionPointContainer
的函数吗?如何做?谢谢。解决立刻给分,不够加。

解决方案 »

  1.   

    2,当然可以在源对象端只要你实现了连接点,调用的时候Fire_XXXXXXX();就可以了!
      

  2.   

    我感觉你的第一个问题是因为:
    客户调用的com的组件没有完全实例化起来,或者有两个com的组件
    存在,调用时没有用到你想要的那个,你可以查一下组件进程实例的
    个数情况。
    提供的信息不够很难做出清晰的判断。
      

  3.   

    问题又有新的进展:
    我使用了宏IMPLEMENT_OLECREATE()后可以源对象的this指针不为空,
    而且正确无误,但是在GetConnections函数内部指针出错。还是非法
    指针ASSERT错误;
    跟进去后发现:GetConnections函数中 ASSERT_VALID(this);//出错
    if (m_pConnections == NULL)
    CreateConnectionArray(); ASSERT(m_pConnections != NULL);
    return m_pConnections;this指针中m_pUnkFirstConnections变量指为0非法值,而且连接点
    数组值非法。
    但是在初始化的时候是正确的。很奇怪。希望能给出排错的方向,可能是什么问题引起的。
      

  4.   

    要使用连接点,必须在CConnectionPoint派生类的构造函数中调用EnableConnections();以初始化m_pUnkFirstConnections。楼主的“2。MFC下IConnectionPointContainer 接口的实现结构XConnPtContainer没有
    FindConnectionPoint函数,我可以在源对象端调用IConnectionPointContainer
    的函数吗?如何做?”是错的。
    MFC实现了IConnectionPointContainer::FindConnectionPoint的,用COleConnPtContainer的成员函数实现的(可查看MSDN),所以不存在没有实现“FindConnectionPoint函数”。只需用
    INTERFACE_PART(名字可能记错)宏指定派生类实现了IConnectionPointContainer接口即可。
      

  5.   

    1。我在构造中加了EnableConnections();而且我跟过出接口advice
    时指针是合法的。初始化成功,但是组件在调用时出接口的连接时就
    不对了,这个问题把我整的够呛。2。明白楼上的意思,我查了一下,确实是实现了接口,但接口是给客户
    端使用的。我想在组件端调用这个接口,就是自己调自己的接口,不是
    通过成员函数方式(成员函数没有那个方法,可能是如楼上所说,内部实现)。
      

  6.   

    1。看看有没有忘了BEGIN_CONNECTION_MAP映射宏2。要自己用IConnectionPointContainer,只需调用QueryInterface即可,再自己释放即可。或者如下:
    COleConnPtContainer temp;
    temp = *reinterpret_cast< COleConnPtContainer* >( &m_xConnPtContainer );
    然后调用temp的成员即可
      

  7.   

    抱歉,上面的2说错了,QueryInterface的IUnknown应通过调用GetInterface获得
      

  8.   

    COleConnPtContainer 类好像没有啊。我没查到。
      

  9.   

    这个问题在lop5712(LOP)的发来的例子程序的帮助下解决了。
    http://expert.csdn.net/Expert/topic/2579/2579386.xml?temp=.6365473