classfac.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 2k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. #include <windows.h>
  2. #include <objbase.h>
  3. #include <shlobj.h>
  4. #include <docobj.h>
  5. #include "shfolder.h"
  6. #include "classfac.h"
  7. extern LONG        g_DllRefCount;
  8. CClassFactory::CClassFactory()
  9. {
  10.     m_ObjRefCount = 1;
  11.     InterlockedIncrement(&g_DllRefCount);
  12. }
  13. CClassFactory::~CClassFactory()
  14. {
  15.     InterlockedDecrement(&g_DllRefCount);
  16. }
  17. STDMETHODIMP
  18. CClassFactory::QueryInterface(
  19.     REFIID riid,
  20.     LPVOID *ppReturn
  21.     )
  22. {
  23.     *ppReturn = NULL;
  24.     if(IsEqualIID(riid, IID_IUnknown))
  25.         *ppReturn = (IUnknown*)(CClassFactory*)this;
  26.     else if(IsEqualIID(riid, IID_IClassFactory))
  27.         *ppReturn = (CClassFactory*)this;
  28. if(*ppReturn == NULL)
  29. return E_NOINTERFACE;
  30.     (*(LPUNKNOWN*)ppReturn)->AddRef();
  31.     return S_OK;
  32. }                                             
  33. STDMETHODIMP_(DWORD)
  34. CClassFactory::AddRef()
  35. {
  36.     return InterlockedIncrement(&m_ObjRefCount);
  37. }
  38. STDMETHODIMP_(DWORD)
  39. CClassFactory::Release()
  40. {
  41. LONG lDecremented = InterlockedDecrement(&m_ObjRefCount);
  42.     
  43.     if(lDecremented == 0)
  44.        delete this;
  45.     return lDecremented;
  46. }
  47. STDMETHODIMP
  48. CClassFactory::CreateInstance(
  49.     LPUNKNOWN pUnknown,
  50.     REFIID riid,
  51.     LPVOID *ppObject
  52.     )
  53. {
  54.     if(pUnknown != NULL)
  55.         return CLASS_E_NOAGGREGATION;
  56.     CShellFolder *pShellFolder = new CShellFolder(NULL, NULL);
  57.     if(NULL == pShellFolder)
  58.         return E_OUTOFMEMORY;
  59.     //
  60.     // get the QueryInterface return for our return value
  61.     //
  62.     HRESULT hResult = pShellFolder->QueryInterface(riid, ppObject);
  63.     //
  64.     // call Release to decrement the ref count
  65.     //
  66.     pShellFolder->Release();
  67.     return hResult;
  68. }
  69. STDMETHODIMP
  70. CClassFactory::LockServer(
  71.     BOOL fLock
  72.     )
  73. {
  74.     return E_NOTIMPL;
  75. }