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

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * ICONNPT.CPP
  3.  * Polyline Component Chapter 10
  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.     //CHAPTER10MOD
  92.     if (IID_IPolylineAdviseSink10==riid)
  93.     //End CHAPTER10MOD
  94.         {
  95.         return m_pObj->m_pConnPt->QueryInterface
  96.             (IID_IConnectionPoint, (PPVOID)ppCP);
  97.         }
  98.     return ResultFromScode(E_NOINTERFACE);
  99.     }
  100. //CConnectionPoint implementation
  101. /*
  102.  * CConnectionPoint::CConnectionPoint
  103.  * CConnectionPoint::~CConnectionPoint
  104.  *
  105.  * Parameters (Constructor):
  106.  *  pObj            PCPolyline of the object we're in.  We can
  107.  *                  query this for the IConnectionPointContainer
  108.  *                  interface we might need.
  109.  */
  110. CConnectionPoint::CConnectionPoint(PCPolyline pObj)
  111.     {
  112.     m_cRef=0;
  113.     /*
  114.      * Our lifetime is controlled by the connectable object itself,
  115.      * although other external clients will call AddRef and Release.
  116.      * Since we're nested in the connectable object's lifetime,
  117.      * there's no need to call AddRef on pObj.
  118.      */
  119.     m_pObj=pObj;
  120.     return;
  121.     }
  122. CConnectionPoint::~CConnectionPoint(void)
  123.     {
  124.     ReleaseInterface(m_pObj->m_pAdv);
  125.     return;
  126.     }
  127. /*
  128.  * CConnectionPoint::QueryInterface
  129.  * CConnectionPoint::AddRef
  130.  * CConnectionPoint::Release
  131.  *
  132.  * Purpose:
  133.  *  Non-delegating IUnknown members for CConnectionPoint.
  134.  */
  135. STDMETHODIMP CConnectionPoint::QueryInterface(REFIID riid
  136.     , LPVOID *ppv)
  137.     {
  138.     *ppv=NULL;
  139.     if (IID_IUnknown==riid || IID_IConnectionPoint==riid)
  140.         *ppv=(LPVOID)this;
  141.     if (NULL!=*ppv)
  142.         {
  143.         ((LPUNKNOWN)*ppv)->AddRef();
  144.         return NOERROR;
  145.         }
  146.     return ResultFromScode(E_NOINTERFACE);
  147.     }
  148. STDMETHODIMP_(ULONG) CConnectionPoint::AddRef(void)
  149.     {
  150.     return ++m_cRef;
  151.     }
  152. STDMETHODIMP_(ULONG) CConnectionPoint::Release(void)
  153.     {
  154.     if (0!=--m_cRef)
  155.         return m_cRef;
  156.     delete this;
  157.     return 0;
  158.     }
  159. /*
  160.  * CConnectionPoint::GetConnectionInterface
  161.  *
  162.  * Purpose:
  163.  *  Returns the IID of the outgoing interface supported through
  164.  *  this connection point.
  165.  *
  166.  * Parameters:
  167.  *  pIID            IID * in which to store the IID.
  168.  */
  169. STDMETHODIMP CConnectionPoint::GetConnectionInterface(IID *pIID)
  170.     {
  171.     if (NULL==pIID)
  172.         return ResultFromScode(E_POINTER);
  173.     //CHAPTER10MOD
  174.     *pIID=IID_IPolylineAdviseSink10;
  175.     //End CHAPTER10MOD
  176.     return NOERROR;
  177.     }
  178. /*
  179.  * CConnectionPoint::GetConnectionPointContainer
  180.  *
  181.  * Purpose:
  182.  *  Returns a pointer to the IConnectionPointContainer that
  183.  *  is manageing this connection point.
  184.  *
  185.  * Parameters:
  186.  *  ppCPC           IConnectionPointContainer ** in which to return
  187.  *                  the pointer after calling AddRef.
  188.  */
  189. STDMETHODIMP CConnectionPoint::GetConnectionPointContainer
  190.     (IConnectionPointContainer **ppCPC)
  191.     {
  192.     return m_pObj->QueryInterface(IID_IConnectionPointContainer
  193.         , (void **)ppCPC);
  194.     }
  195. /*
  196.  * CConnectionPoint::Advise
  197.  *
  198.  * Purpose:
  199.  *  Provides this connection point with a notification sink to
  200.  *  call whenever the appropriate outgoing function/event occurs.
  201.  *
  202.  * Parameters:
  203.  *  pUnkSink        LPUNKNOWN to the sink to notify.  The connection
  204.  *                  point must QueryInterface on this pointer to obtain
  205.  *                  the proper interface to call.  The connection
  206.  *                  point must also insure that any pointer held has
  207.  *                  a reference count (QueryInterface will do it).
  208.  *  pdwCookie       DWORD * in which to store the connection key for
  209.  *                  later calls to Unadvise.
  210.  */
  211. STDMETHODIMP CConnectionPoint::Advise(LPUNKNOWN pUnkSink
  212.     , DWORD *pdwCookie)
  213.     {
  214.     //CHAPTER10MOD
  215.     IPolylineAdviseSink10  *pSink;
  216.     //End CHAPTER10MOD
  217.     *pdwCookie=0;
  218.     //Only allow one connection
  219.     if (NULL!=m_pObj->m_pAdv)
  220.         return ResultFromScode(CONNECT_E_ADVISELIMIT);
  221.     //Check for the right interface on the sink.
  222.     //CHAPTER10MOD
  223.     if (FAILED(pUnkSink->QueryInterface(IID_IPolylineAdviseSink10
  224.         , (PPVOID)&pSink)))
  225.     //End CHAPTER10MOD
  226.         return ResultFromScode(CONNECT_E_CANNOTCONNECT);
  227.     *pdwCookie=ADVISEKEY;
  228.     m_pObj->m_pAdv=pSink;
  229.     return NOERROR;
  230.     }
  231. /*
  232.  * CConnectionPoint::Unadvise
  233.  *
  234.  * Purpose:
  235.  *  Terminates the connection to the notification sink identified
  236.  *  with dwCookie (that was returned from Advise).  The connection
  237.  *  point has to Release any held pointers for that sink.
  238.  *
  239.  * Parameters:
  240.  *  dwCookie        DWORD connection key from Advise.
  241.  */
  242. STDMETHODIMP CConnectionPoint::Unadvise(DWORD dwCookie)
  243.     {
  244.     if (0==dwCookie)
  245.         return ResultFromScode(E_INVALIDARG);
  246.     if (ADVISEKEY!=dwCookie)
  247.         ResultFromScode(CONNECT_E_NOCONNECTION);
  248.     ReleaseInterface(m_pObj->m_pAdv);
  249.     return NOERROR;
  250.     }
  251. /*
  252.  * CConnectionPoint::EnumConnections
  253.  *
  254.  * Purpose:
  255.  *  Not implemented.
  256.  */
  257. STDMETHODIMP CConnectionPoint::EnumConnections
  258.     (LPENUMCONNECTIONS *ppEnum)
  259.     {
  260.     *ppEnum=NULL;
  261.     return ResultFromScode(E_NOTIMPL);
  262.     }