那你怎么调用回调方法了??

解决方案 »

  1.   

    连接点的实质不也是回调函数!
      

  2.   

    能不能说一下你们是怎样实现的!
      

  3.   

    回调法只能是进程内组件可以用.
    进程外组件还是用连接点吧
      

  4.   

    与连接点相关的接口是IConnectionPoint和IConnectionPointContainer,这是COM为ActiveX 定义的标准接口,ActiveX 控件与容器之间的事件就是通过这两个接口来进行协商的,这个过程有点罗嗦,ATL中的两个函数AtlAdvise和AtlUnadvise很好的简化了这个过程,其实它们的作用就是用来设置回调。但是,这两个接口只是用于协商而并非回调函数的接口,COM/DCOM把基于连接点的回调函数接口(或者事件的接口)称之为"Outgoing Interface",因为作为COM/DCOM服务器只是定义了这些接口,而具体的实现则是由COM/DCOM的客户来完成,而服务器只是调用这些接口中的方法。所以基于连接点的方法实质上与回调函数的确没有什么本质上的区别,或者更确切的说,与一个COM/DCOM的客户调用COM/DCOM服务器的方法没有什么本质上的区别。
    用ATL向导实现的基于连接点的事件处理一般都可以跨进程或者跨机器,因为这些事件的接口实际上都是基于IDispatch的接口,而Windows系统可以对标准的接口(如IUnknow, IDispatch)进行调度。但是基于连接点的方法并没有限定具体的事件接口,所以,你也可使用自定义的接口作为事件处理的接口,在这种情况下,你必须手工实现调度(Marshal)或者利用IDL编译器生成调度代码,这种要求和远程调用一个DCOM对象的要求是一样的,只不过这个时候客户和服务器的角色正好相反。
    综上所述,你不一定非得通过连接点的方法去进行事件的协商,你完全可以在自己的COM/DCOM服务器的接口中定义这样的方法。
    STDMETHOD(AddCallBack)(IUnown* pUnkCallback, DWORD* pdwReg);
    STDMETHOD(RemoveCallback(DWORD dwReg);
    其它的与基于连接点的方法就没有什么两样了。