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

Windows编程

开发平台:

Visual C++

  1. /*++
  2. Copyright (c) 1996 Microsoft Corporation
  3. Module Name:
  4.     CProv.cpp
  5. Abstract:
  6.     ADsSampleDS Provider Object
  7. Author:
  8. Environment:
  9.     User mode
  10. Revision History :
  11. --*/
  12. #include "adssmp.h"
  13. #pragma hdrstop
  14. CSampleDSProvider::CSampleDSProvider()
  15. {
  16. }
  17. HRESULT
  18. CSampleDSProvider::Create(CSampleDSProvider FAR * FAR * ppProvider)
  19. {
  20.     CSampleDSProvider FAR * pProvider = NULL;
  21.     HRESULT hr = S_OK;
  22.     //Create the Provider Object
  23.     pProvider = new CSampleDSProvider();
  24.     if (pProvider == NULL) {
  25.         RRETURN(ResultFromScode(E_OUTOFMEMORY));
  26.     }
  27.     if (FAILED(hr)) {
  28.         delete pProvider;
  29.         RRETURN(hr);
  30.     }
  31.     *ppProvider = pProvider;
  32.     RRETURN(hr);
  33. }
  34. CSampleDSProvider::~CSampleDSProvider( )
  35. {
  36.     ENLIST_TRACKING(CSampleDSProvider);
  37. }
  38. STDMETHODIMP
  39. CSampleDSProvider::QueryInterface(REFIID iid, LPVOID FAR* ppv)
  40. {
  41.     if (IsEqualIID(iid, IID_IUnknown))
  42.     {
  43.         *ppv = this;
  44.     }
  45.     else if (IsEqualIID(iid, IID_IParseDisplayName))
  46.     {
  47.         *ppv = (IADs FAR *) this;
  48.     }
  49.     else
  50.     {
  51.         *ppv = NULL;
  52.         return E_NOINTERFACE;
  53.     }
  54.     AddRef();
  55.     return NOERROR;
  56. }
  57. STDMETHODIMP
  58. CSampleDSProvider::ParseDisplayName(IBindCtx* pbc, WCHAR* szDisplayName, ULONG* pchEaten, IMoniker** ppmk)
  59. {
  60.     HRESULT hr;
  61.     *ppmk = NULL;
  62.     if (pchEaten != NULL){
  63.         *pchEaten = 0;
  64.     }
  65.     hr = ResolvePathName(
  66.                 pbc,
  67.                 szDisplayName,
  68.                 pchEaten,
  69.                 ppmk
  70.                 );
  71.     RRETURN(hr);
  72. }
  73. HRESULT
  74. CSampleDSProvider::ResolvePathName(IBindCtx* pbc,
  75.                 WCHAR* szDisplayName,
  76.                 ULONG* pchEaten,
  77.                 IMoniker** ppmk
  78.                 )
  79. {
  80.     HRESULT hr;
  81.     LPUNKNOWN pUnknown = NULL;
  82.     *pchEaten = 0;
  83.     hr = GetObject(szDisplayName, (LPVOID *)&pUnknown);
  84.     BAIL_IF_ERROR(hr);
  85.     hr = CreatePointerMoniker(pUnknown, ppmk);
  86.     BAIL_IF_ERROR(hr);
  87.     *pchEaten += wcslen(szDisplayName);
  88. cleanup:
  89.     if (pUnknown) {
  90.         pUnknown->Release();
  91.     }
  92.     RRETURN (hr);
  93. }