ICONNPT.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:9k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * ICONNPT.CPP
  3.  * Polyline Component Chapter 23
  4.  *
  5.  * Implementation of CImpIConnectionPoint for the Polyline object
  6.  * as well as CConnectionPoint.
  7.  *
  8.  *
  9.  * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
  10.  *
  11.  * Kraig Brockschmidt, Microsoft
  12.  * Internet  :  kraigb@microsoft.com
  13.  * Compuserve:  >INTERNET:kraigb@microsoft.com
  14.  */
  15. #include "polyline.h"
  16. /*
  17.  * CImpIConnPtCont:CImpIConnPtCont
  18.  * CImpIConnPtCont::~CImpIConnPtCont
  19.  *
  20.  * Constructor Parameters:
  21.  *  pObj            PCPolyline pointing to the object we live in.
  22.  *  pUnkOuter       LPUNKNOWN of the controlling unknown.
  23.  */
  24. CImpIConnPtCont::CImpIConnPtCont(PCPolyline pObj
  25.     , LPUNKNOWN pUnkOuter)
  26.     {
  27.     m_cRef=0;
  28.     m_pObj=pObj;
  29.     m_pUnkOuter=pUnkOuter;
  30.     return;
  31.     }
  32. CImpIConnPtCont::~CImpIConnPtCont(void)
  33.     {
  34.     return;
  35.     }
  36. /*
  37.  * CImpIConnPtCont::QueryInterface
  38.  * CImpIConnPtCont::AddRef
  39.  * CImpIConnPtCont::Release
  40.  */
  41. STDMETHODIMP CImpIConnPtCont::QueryInterface(REFIID riid, PPVOID ppv)
  42.     {
  43.     return m_pUnkOuter->QueryInterface(riid, ppv);
  44.     }
  45. STDMETHODIMP_(ULONG) CImpIConnPtCont::AddRef(void)
  46.     {
  47.     ++m_cRef;
  48.     return m_pUnkOuter->AddRef();
  49.     }
  50. STDMETHODIMP_(ULONG) CImpIConnPtCont::Release(void)
  51.     {
  52.     --m_cRef;
  53.     return m_pUnkOuter->Release();
  54.     }
  55. /*
  56.  * CImpIConnPtCont::EnumConnectionPoints
  57.  *
  58.  * Purpose:
  59.  *  Not implemented.
  60.  *
  61.  * Return Value:
  62.  *  HRESULT         E_NOTIMPL
  63.  */
  64. STDMETHODIMP CImpIConnPtCont::EnumConnectionPoints
  65.     (LPENUMCONNECTIONPOINTS *ppEnum)
  66.     {
  67.     *ppEnum=NULL;
  68.     return ResultFromScode(E_NOTIMPL);
  69.     }
  70. /*
  71.  * CImpIConnPtCont::FindConnectionPoint
  72.  *
  73.  * Purpose:
  74.  *  Returns a pointer to the IConnectionPoint for a given
  75.  *  outgoing IID.
  76.  *
  77.  * Parameters:
  78.  *  riid            REFIID of the outgoing interface for which
  79.  *                  a connection point is desired.
  80.  *  ppCP            IConnectionPoint ** in which to return
  81.  *                  the pointer after calling AddRef.
  82.  *
  83.  * Return Value:
  84.  *  HRESULT         NOERROR if the connection point is found,
  85.  *                  E_NOINTERFACE if it's not supported.
  86.  */
  87. STDMETHODIMP CImpIConnPtCont::FindConnectionPoint(REFIID riid
  88.     , IConnectionPoint **ppCP)
  89.     {
  90.     *ppCP=NULL;
  91.     //CHAPTER24MOD
  92.     if (IID_IPolylineAdviseSink10==riid
  93.         || DIID_DIPolylineAdviseSink10==riid)
  94.         {
  95.         /*
  96.          * This tells the connection point which one we're
  97.          * using.  Note that Polyline only has one
  98.          * connection point and can handle only one sink.
  99.          */
  100.         m_pObj->m_pConnPt->SetIID(riid);
  101.         return m_pObj->m_pConnPt->QueryInterface
  102.             (IID_IConnectionPoint, (PPVOID)ppCP);
  103.         }
  104.     //End CHAPTER24MOD
  105.     return ResultFromScode(E_NOINTERFACE);
  106.     }
  107. //CConnectionPoint implementation
  108. /*
  109.  * CConnectionPoint::CConnectionPoint
  110.  * CConnectionPoint::~CConnectionPoint
  111.  *
  112.  * Parameters (Constructor):
  113.  *  pObj            PCPolyline of the object we're in.  We can
  114.  *                  query this for the IConnectionPointContainer
  115.  *                  interface we might need.
  116.  */
  117. CConnectionPoint::CConnectionPoint(PCPolyline pObj)
  118.     {
  119.     m_cRef=0;
  120.     /*
  121.      * Our lifetime is controlled by the connectable object itself,
  122.      * although other external clients will call AddRef and Release.
  123.      * Since we're nested in the connectable object's lifetime,
  124.      * there's no need to call AddRef on pObj.
  125.      */
  126.     m_pObj=pObj;
  127.     return;
  128.     }
  129. CConnectionPoint::~CConnectionPoint(void)
  130.     {
  131.     ReleaseInterface(m_pObj->m_pAdv);
  132.     return;
  133.     }
  134. //CHAPTER24MOD
  135. /*
  136.  * CConnectionPoint::SetIID
  137.  *
  138.  * Purpose:
  139.  *  Informs the connection point which outgoing interface
  140.  *  it should use (vtable or dispatch interface).
  141.  *
  142.  * Parameters:
  143.  *  riid            REFIID of the interface we're using.
  144.  */
  145. void CConnectionPoint::SetIID(REFIID riid)
  146.     {
  147.     m_iid=riid;
  148.     return;
  149.     }
  150. //End CHAPTER24MOD
  151. /*
  152.  * CConnectionPoint::QueryInterface
  153.  * CConnectionPoint::AddRef
  154.  * CConnectionPoint::Release
  155.  *
  156.  * Purpose:
  157.  *  Non-delegating IUnknown members for CConnectionPoint.
  158.  */
  159. STDMETHODIMP CConnectionPoint::QueryInterface(REFIID riid
  160.     , LPVOID *ppv)
  161.     {
  162.     *ppv=NULL;
  163.     if (IID_IUnknown==riid || IID_IConnectionPoint==riid)
  164.         *ppv=(LPVOID)this;
  165.     if (NULL!=*ppv)
  166.         {
  167.         ((LPUNKNOWN)*ppv)->AddRef();
  168.         return NOERROR;
  169.         }
  170.     return ResultFromScode(E_NOINTERFACE);
  171.     }
  172. STDMETHODIMP_(ULONG) CConnectionPoint::AddRef(void)
  173.     {
  174.     return ++m_cRef;
  175.     }
  176. STDMETHODIMP_(ULONG) CConnectionPoint::Release(void)
  177.     {
  178.     if (0!=--m_cRef)
  179.         return m_cRef;
  180.     delete this;
  181.     return 0;
  182.     }
  183. /*
  184.  * CConnectionPoint::GetConnectionInterface
  185.  *
  186.  * Purpose:
  187.  *  Returns the IID of the outgoing interface supported through
  188.  *  this connection point.
  189.  *
  190.  * Parameters:
  191.  *  pIID            IID * in which to store the IID.
  192.  */
  193. STDMETHODIMP CConnectionPoint::GetConnectionInterface(IID *pIID)
  194.     {
  195.     if (NULL==pIID)
  196.         return ResultFromScode(E_POINTER);
  197.     //CHPATER24MOD
  198.     *pIID=m_iid;
  199.     //End CHAPTER24MOD
  200.     return NOERROR;
  201.     }
  202. /*
  203.  * CConnectionPoint::GetConnectionPointContainer
  204.  *
  205.  * Purpose:
  206.  *  Returns a pointer to the IConnectionPointContainer that
  207.  *  is manageing this connection point.
  208.  *
  209.  * Parameters:
  210.  *  ppCPC           IConnectionPointContainer ** in which to return
  211.  *                  the pointer after calling AddRef.
  212.  */
  213. STDMETHODIMP CConnectionPoint::GetConnectionPointContainer
  214.     (IConnectionPointContainer **ppCPC)
  215.     {
  216.     return m_pObj->QueryInterface(IID_IConnectionPointContainer
  217.         , (void **)ppCPC);
  218.     }
  219. /*
  220.  * CConnectionPoint::Advise
  221.  *
  222.  * Purpose:
  223.  *  Provides this connection point with a notification sink to
  224.  *  call whenever the appropriate outgoing function/event occurs.
  225.  *
  226.  * Parameters:
  227.  *  pUnkSink        LPUNKNOWN to the sink to notify.  The connection
  228.  *                  point must QueryInterface on this pointer to obtain
  229.  *                  the proper interface to call.  The connection
  230.  *                  point must also insure that any pointer held has
  231.  *                  a reference count (QueryInterface will do it).
  232.  *  pdwCookie       DWORD * in which to store the connection key for
  233.  *                  later calls to Unadvise.
  234.  */
  235. STDMETHODIMP CConnectionPoint::Advise(LPUNKNOWN pUnkSink
  236.     , DWORD *pdwCookie)
  237.     {
  238.     IPolylineAdviseSink10  *pSink;
  239.     *pdwCookie=0;
  240.     //Only allow one connection
  241.     if (NULL!=m_pObj->m_pAdv)
  242.         return ResultFromScode(CONNECT_E_ADVISELIMIT);
  243.     //CHAPTER24MOD
  244.     /*
  245.      * Polyline code is set to handle calls to
  246.      * IPolylineAdviseSink10 everywhere else around the code.
  247.      * To handle calling a control container's dispinterface
  248.      * implementation of the dispatch version of this interface,
  249.      * we'll create an instance of our own CAdviseRouter
  250.      * and get an IPolylineAdviseSink10 from it.  That router
  251.      * will then convert vtable calls into IDispatch calls.
  252.      */
  253.     if (DIID_DIPolylineAdviseSink10==m_iid)
  254.         {
  255.         IDispatch  *pIDisp;
  256.         if (FAILED(pUnkSink->QueryInterface(m_iid
  257.             , (PPVOID)&pIDisp)))
  258.             {
  259.             return ResultFromScode(CONNECT_E_CANNOTCONNECT);
  260.             }
  261.         /*
  262.          * We have IDispatch, create a wrapper for it,
  263.          * which takes ownership of the pointer.
  264.          */
  265.         pSink=new CAdviseRouter(pIDisp, m_pObj);
  266.         pSink->AddRef();
  267.         }
  268.     //Otherwise, do what we always did before
  269.     if (IID_IPolylineAdviseSink10==m_iid)
  270.         {
  271.         //Check for the right interface on the sink.
  272.         if (FAILED(pUnkSink->QueryInterface(m_iid
  273.             , (PPVOID)&pSink)))
  274.             {
  275.             return ResultFromScode(CONNECT_E_CANNOTCONNECT);
  276.             }
  277.         }
  278.     //End CHAPTER24MOD
  279.     *pdwCookie=ADVISEKEY;
  280.     m_pObj->m_pAdv=pSink;
  281.     return NOERROR;
  282.     }
  283. /*
  284.  * CConnectionPoint::Unadvise
  285.  *
  286.  * Purpose:
  287.  *  Terminates the connection to the notification sink identified
  288.  *  with dwCookie (that was returned from Advise).  The connection
  289.  *  point has to Release any held pointers for that sink.
  290.  *
  291.  * Parameters:
  292.  *  dwCookie        DWORD connection key from Advise.
  293.  */
  294. STDMETHODIMP CConnectionPoint::Unadvise(DWORD dwCookie)
  295.     {
  296.     if (0==dwCookie)
  297.         return ResultFromScode(E_INVALIDARG);
  298.     if (ADVISEKEY!=dwCookie)
  299.         ResultFromScode(CONNECT_E_NOCONNECTION);
  300.     ReleaseInterface(m_pObj->m_pAdv);
  301.     return NOERROR;
  302.     }
  303. /*
  304.  * CConnectionPoint::EnumConnections
  305.  *
  306.  * Purpose:
  307.  *  Not implemented.
  308.  */
  309. STDMETHODIMP CConnectionPoint::EnumConnections
  310.     (LPENUMCONNECTIONS *ppEnum)
  311.     {
  312.     *ppEnum=NULL;
  313.     return ResultFromScode(E_NOTIMPL);
  314.     }