home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / mfc / ole / tstcon / bindhost.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-03-27  |  3.6 KB  |  192 lines

  1. #include "StdAfx.H"
  2. #include "TestCon.H"
  3.  
  4. #ifdef _DEBUG
  5. #define new DEBUG_NEW
  6. #undef THIS_FILE
  7. static char THIS_FILE[] = __FILE__;
  8. #endif
  9.  
  10. CTCBindHost::CTCBindHost() :
  11.    m_nRefCount( 0 )
  12. {
  13. }
  14.  
  15. CTCBindHost::~CTCBindHost()
  16. {
  17. }
  18.  
  19. HRESULT CTCBindHost::CreateInstance( REFIID iid, void** ppObject )
  20. {
  21.    CTCBindHost* pObject;
  22.    HRESULT hResult;
  23.  
  24.    if( ppObject == NULL )
  25.    {
  26.       return( E_POINTER );
  27.    }
  28.    *ppObject = NULL;
  29.  
  30.    pObject = new CTCBindHost;
  31.    if( pObject == NULL )
  32.    {
  33.       return( E_OUTOFMEMORY );
  34.    }
  35.  
  36.    hResult = pObject->QueryInterface( iid, ppObject );
  37.    if( FAILED( hResult ) )
  38.    {
  39.       delete pObject;
  40.       return( hResult );
  41.    }
  42.  
  43.    ASSERT( *ppObject != NULL );
  44.  
  45.    return( S_OK );
  46. }
  47.  
  48.  
  49. ///////////////////////////////////////////////////////////////////////////////
  50. // IUnknown
  51. ///////////////////////////////////////////////////////////////////////////////
  52.  
  53. STDMETHODIMP_( ULONG ) CTCBindHost::AddRef()
  54. {
  55.    m_nRefCount++;
  56.  
  57.    return( m_nRefCount );
  58. }
  59.  
  60. STDMETHODIMP_( ULONG ) CTCBindHost::Release()
  61. {
  62.    m_nRefCount--;
  63.  
  64.    if( m_nRefCount == 0 )
  65.    {
  66.       delete this;
  67.       return( 0 );
  68.    }
  69.  
  70.    return( m_nRefCount );
  71. }
  72.  
  73. STDMETHODIMP CTCBindHost::QueryInterface( REFIID iid, void** ppInterface )
  74. {
  75.    if( ppInterface == NULL )
  76.    {
  77.       return( E_POINTER );
  78.    }
  79.    *ppInterface = NULL;
  80.  
  81.    if( IsEqualIID( iid, IID_IUnknown ) || IsEqualIID( iid, IID_IBindHost ) )
  82.    {
  83.       *ppInterface = (IBindHost*)this;
  84.       AddRef();
  85.       return( S_OK );
  86.    }
  87.  
  88.    return( E_NOINTERFACE );
  89. }
  90.  
  91.  
  92. ///////////////////////////////////////////////////////////////////////////////
  93. // IBindHost
  94. ///////////////////////////////////////////////////////////////////////////////
  95.  
  96. STDMETHODIMP CTCBindHost::CreateMoniker( LPOLESTR pszName, IBindCtx* pBindCtx,
  97.    IMoniker** ppMoniker, DWORD dwReserved )
  98. {
  99.    HRESULT hResult;
  100.  
  101.    (void)pBindCtx;
  102.    (void)dwReserved;
  103.  
  104.    if( ppMoniker == NULL )
  105.    {
  106.       return( E_POINTER );
  107.    }
  108.    *ppMoniker = NULL;
  109.  
  110.    if( pszName == NULL )
  111.    {
  112.       return( E_INVALIDARG );
  113.    }
  114.  
  115.    hResult = CreateURLMoniker( NULL, pszName, ppMoniker );
  116.    if( FAILED( hResult ) )
  117.    {
  118.       return( hResult );
  119.    }
  120.  
  121.    ASSERT( *ppMoniker != NULL );
  122.  
  123.    return( S_OK );
  124. }
  125.  
  126. STDMETHODIMP CTCBindHost::MonikerBindToObject( IMoniker* pMoniker,
  127.    IBindCtx* pBindCtx, IBindStatusCallback* pBSC, REFIID iid, void** ppObject )
  128. {
  129.    (void)pMoniker;
  130.    (void)pBindCtx;
  131.    (void)pBSC;
  132.    (void)iid;
  133.  
  134.    if( ppObject == NULL )
  135.    {
  136.       return( E_POINTER );
  137.    }
  138.    *ppObject = NULL;
  139.  
  140.    return( E_NOTIMPL );
  141. }
  142.  
  143. STDMETHODIMP CTCBindHost::MonikerBindToStorage( IMoniker* pMoniker,
  144.    IBindCtx* pBindCtx, IBindStatusCallback* pBSC, REFIID iid, void** ppObject )
  145. {
  146.    HRESULT hResult;
  147.    IBindCtxPtr pNewBindCtx;
  148.  
  149.    TCTrace( TRACELEVEL_NORMAL, "IBindHost::MonikerBindToStorage\n" );
  150.  
  151.    if( ppObject == NULL )
  152.    {
  153.       return( E_POINTER );
  154.    }
  155.    *ppObject = NULL;
  156.  
  157.    if( pBindCtx != NULL )
  158.    {
  159.       pNewBindCtx = pBindCtx;
  160.       if( pBSC )
  161.       {
  162.          hResult = RegisterBindStatusCallback( pBindCtx, pBSC, NULL, 0 );
  163.          if( FAILED( hResult ) )
  164.          {
  165.             return( hResult );
  166.          }
  167.       }
  168.    }
  169.    else
  170.    {
  171.       if( pBSC )
  172.       {
  173.          hResult = CreateAsyncBindCtx( 0, pBSC, NULL, &pNewBindCtx );
  174.          if( FAILED( hResult ) )
  175.          {
  176.             return( hResult );
  177.          }
  178.       }
  179.       else
  180.       {
  181.          hResult = CreateBindCtx( 0, &pNewBindCtx );
  182.          if( FAILED( hResult ) )
  183.          {
  184.             return( hResult );
  185.          }
  186.       }
  187.    }
  188.    ASSERT( pNewBindCtx != NULL );
  189.  
  190.    return( pMoniker->BindToStorage( pNewBindCtx, NULL, iid, ppObject ) );
  191. }
  192.