home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / winui / shell / dropext / defclsf.c next >
Encoding:
C/C++ Source or Header  |  1997-10-05  |  6.0 KB  |  200 lines

  1.  
  2. /******************************************************************************\
  3. *       This is a part of the Microsoft Source Code Samples. 
  4. *       Copyright (C) 1995-1997 Microsoft Corporation.
  5. *       All rights reserved. 
  6. *       This source code is only intended as a supplement to 
  7. *       Microsoft Development Tools and/or WinHelp documentation.
  8. *       See these sources for detailed information regarding the 
  9. *       Microsoft samples programs.
  10. \******************************************************************************/
  11.  
  12. //
  13. // This file contains the implementation of SHCreateDefClassObject
  14. //
  15.  
  16. #include "priv.h"
  17.  
  18. //=========================================================================
  19. // CDefClassFactory class
  20. //=========================================================================
  21.  
  22. STDMETHODIMP CDefClassFactory_QueryInterface(IClassFactory FAR * pcf, REFIID riid, LPVOID FAR* ppvObj);
  23. ULONG STDMETHODCALLTYPE CDefClassFactory_AddRef(IClassFactory FAR * pcf);
  24. ULONG STDMETHODCALLTYPE CDefClassFactory_Release(IClassFactory FAR * pcf);
  25. STDMETHODIMP CDefClassFactory_CreateInstance(IClassFactory FAR * pcf, LPUNKNOWN pUnkOuter,
  26.                               REFIID riid,
  27.                               LPVOID FAR* ppvObject);
  28. STDMETHODIMP CDefClassFactory_LockServer(IClassFactory FAR * pcf, BOOL fLock);
  29.  
  30. //
  31. // CDefClassFactory: Class definition
  32. //
  33. #pragma data_seg(".text")
  34. IClassFactoryVtbl c_vtblAppUIClassFactory = {
  35.             CDefClassFactory_QueryInterface,
  36.             CDefClassFactory_AddRef,
  37.             CDefClassFactory_Release,
  38.             CDefClassFactory_CreateInstance,
  39.         CDefClassFactory_LockServer
  40. };
  41. #pragma data_seg()
  42.  
  43. typedef struct
  44. {
  45.     IClassFactory      cf;        
  46.     UINT               cRef;        // Reference count
  47.     LPFNCREATEINSTANCE lpfnCI;        // CreateInstance callback entry
  48.     UINT FAR *         pcRefDll;    // Reference count of the DLL
  49.     const IID FAR *    riidInst;        // Optional interface for instance
  50. } CDefClassFactory;
  51.  
  52. //
  53. // CDefClassFactory::QueryInterface
  54. //
  55. STDMETHODIMP CDefClassFactory_QueryInterface(IClassFactory FAR * pcf, REFIID riid, LPVOID FAR* ppvObj)
  56. {
  57.     register CDefClassFactory * this=IToClassN(CDefClassFactory, cf, pcf);
  58.     if (IsEqualIID(riid, &IID_IClassFactory)
  59.      || IsEqualIID(riid, &IID_IUnknown))
  60.     {
  61.     (LPCLASSFACTORY)*ppvObj = &this->cf;
  62.     this->cRef++;
  63.         return NOERROR;
  64.     }
  65.     return ResultFromScode(E_NOINTERFACE);
  66. }
  67.  
  68. //
  69. // CDefClassFactory::AddRef
  70. //
  71. ULONG STDMETHODCALLTYPE CDefClassFactory_AddRef(IClassFactory FAR * pcf)
  72. {
  73.     register CDefClassFactory * this=IToClassN(CDefClassFactory, cf, pcf);
  74.     return (++this->cRef);
  75. }
  76.  
  77. //
  78. // CDefClassFactory::Release
  79. //
  80. ULONG STDMETHODCALLTYPE CDefClassFactory_Release(IClassFactory FAR * pcf)
  81. {
  82.     register CDefClassFactory * this=IToClassN(CDefClassFactory, cf, pcf);
  83.     if (--this->cRef > 0)
  84.     return this->cRef;
  85.  
  86.     if (this->pcRefDll) {
  87.     (*this->pcRefDll)--;
  88.     }
  89.     LocalFree((HLOCAL)this);
  90.  
  91.     return 0;
  92. }
  93.  
  94. //
  95. // CDefClassFactory::CDefClassFactory
  96. //
  97. STDMETHODIMP CDefClassFactory_CreateInstance(IClassFactory FAR * pcf, LPUNKNOWN pUnkOuter,
  98.                               REFIID riid,
  99.                               LPVOID FAR* ppvObject)
  100. {
  101.     register CDefClassFactory * this=IToClassN(CDefClassFactory, cf, pcf);
  102.  
  103.     //
  104.     // We don't support aggregation at all.
  105.     //
  106.     if (pUnkOuter)
  107.     {
  108.     return ResultFromScode(CLASS_E_NOAGGREGATION);
  109.     }
  110.  
  111.     //
  112.     // if this->riidInst is specified, they should match.
  113.     //
  114.     if (this->riidInst==NULL
  115.      || IsEqualIID(riid, this->riidInst)
  116.      || IsEqualIID(riid, &IID_IUnknown))
  117.     {
  118.     return this->lpfnCI(pUnkOuter, riid, ppvObject);
  119.     }
  120.  
  121.     return ResultFromScode(E_NOINTERFACE);
  122. }
  123.  
  124. //
  125. // CDefClassFactory::LockServer
  126. //
  127. STDMETHODIMP CDefClassFactory_LockServer(IClassFactory FAR * pcf, BOOL fLock)
  128. {
  129.     // REVIEW: Is this appropriate?
  130.     return ResultFromScode(E_NOTIMPL);
  131. }
  132.  
  133.  
  134. //
  135. // CDefClassFactory constructor
  136. //
  137. CDefClassFactory * NEAR PASCAL CDefClassFactory_Create(
  138.         LPFNCREATEINSTANCE lpfnCI, UINT FAR * pcRefDll, REFIID riidInst)
  139. {
  140.     register CDefClassFactory * pacf;
  141.     pacf = (CDefClassFactory *)LocalAlloc(LPTR, sizeof(CDefClassFactory));
  142.     if (pacf)
  143.     {
  144.     pacf->cf.lpVtbl = &c_vtblAppUIClassFactory;
  145.     pacf->cRef++;  // pacf->cRef=0; (generates smaller code)
  146.     pacf->pcRefDll = pcRefDll;
  147.     pacf->lpfnCI = lpfnCI;
  148.     pacf->riidInst = riidInst;
  149.     if (pcRefDll) {
  150.         (*pcRefDll)++;
  151.     }
  152.     }
  153.     return pacf;
  154. }
  155.  
  156.  
  157. // BUGBUG: remove this for build 86
  158.  
  159. STDAPI Shell_CreateDefClassObject(REFIID riid, LPVOID FAR* ppv,
  160.              LPFNCREATEINSTANCE lpfnCI, UINT FAR * pcRefDll,
  161.              REFIID riidInst)
  162. {
  163.     MessageBeep(0);
  164.     // DebugMsg(DM_TRACE, "Shell_CreateDefClassObject: obsolete, use SHCreateDefClassObject");
  165.     return SHCreateDefClassObject(riid, ppv, lpfnCI, pcRefDll, riidInst);
  166. }
  167.  
  168. //
  169. // creates a simple default implementation of IClassFactory
  170. //
  171. // Parameters:
  172. //  riid     -- Specifies the interface to the class object
  173. //  ppv      -- Specifies the pointer to LPVOID where the class object pointer
  174. //               will be returned.
  175. //  lpfnCI   -- Specifies the callback entry for instanciation.
  176. //  pcRefDll -- Specifies the address to the DLL reference count (optional)
  177. //  riidInst -- Specifies the interface to the instance (optional).
  178. //
  179. // Notes:
  180. //   The riidInst will be specified only if the instance of the class
  181. //  support only one interface.
  182. //
  183. STDAPI SHCreateDefClassObject(REFIID riid, LPVOID FAR* ppv,
  184.              LPFNCREATEINSTANCE lpfnCI, UINT FAR * pcRefDll,
  185.              REFIID riidInst)
  186. {
  187.     // The default class factory supports only IClassFactory interface
  188.     if (IsEqualIID(riid, &IID_IClassFactory))
  189.     {
  190.     CDefClassFactory * pacf = CDefClassFactory_Create(lpfnCI, pcRefDll, riidInst);
  191.     if (pacf)
  192.     {
  193.         (IClassFactory FAR *)*ppv = &pacf->cf;
  194.         return NOERROR;
  195.     }
  196.     return ResultFromScode(E_OUTOFMEMORY);
  197.     }
  198.     return ResultFromScode(E_NOINTERFACE);
  199. }
  200.