home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / graphics / video / dseqfile / factory.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1997-10-05  |  4.9 KB  |  178 lines

  1. /**************************************************************************
  2.  *
  3.  *  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  4.  *  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  5.  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
  6.  *  PURPOSE.
  7.  *
  8.  *  Copyright (C) 1992 - 1997 Microsoft Corporation.  All Rights Reserved.
  9.  *
  10.  **************************************************************************/
  11.  
  12.  
  13. #define _INC_OLE
  14. #include <windows.h>
  15. #include <windowsx.h>
  16. #include <mmsystem.h>
  17. #include <string.h>
  18. #include <ole2.h>
  19.  
  20. #define INITGUID
  21. #include <initguid.h>
  22. // Bring in the external GUIDs we need....
  23. //DEFINE_OLEGUID(IID_IUnknown,            0x00000000L, 0, 0);
  24. //DEFINE_OLEGUID(IID_IClassFactory,       0x00000001L, 0, 0);
  25. //DEFINE_OLEGUID(IID_IMarshal,            0x00000003L, 0, 0);
  26.  
  27. #include <vfw.h>
  28. #include "handler.h"
  29.  
  30. HMODULE ghModule = NULL;        // global HMODULE/HINSTANCE for resource access
  31.  
  32. /*      -       -       -       -       -       -       -       -       */
  33. EXTERN_C BOOL APIENTRY DllMain(HANDLE, DWORD, LPVOID);
  34. EXTERN_C BOOL APIENTRY DllMain(
  35. HANDLE hModule,
  36. DWORD dwReason,
  37. LPVOID lpReserved )
  38. {
  39.         switch( dwReason)
  40.         {
  41.                 case DLL_PROCESS_ATTACH:
  42.                         if(ghModule == NULL)
  43.                                 ghModule = (HMODULE)hModule;
  44.                         break;
  45.                 case DLL_THREAD_ATTACH:
  46.                         break;
  47.                 case DLL_THREAD_DETACH:
  48.                         break;
  49.                 case DLL_PROCESS_DETACH:
  50.                         break;
  51.         }
  52.         return TRUE;
  53. }
  54.  
  55. /*      -       -       -       -       -       -       -       -       */
  56.  
  57. EXTERN_C BOOL FAR PASCAL WEP(
  58.         BOOL    fSystemExit)
  59. {
  60.         return TRUE;
  61. }
  62.  
  63. /*      -       -       -       -       -       -       -       -       */
  64.  
  65. STDAPI DllCanUnloadNow(
  66.         void)
  67. {
  68.         return ResultFromScode((fLocked || uUseCount) ? S_FALSE : S_OK);
  69. }
  70.  
  71. /*      -       -       -       -       -       -       -       -       */
  72.  
  73. STDAPI DllGetClassObject(
  74.         const CLSID FAR&        rclsid,
  75.         const IID FAR&  riid,
  76.         void FAR* FAR*  ppv)
  77. {
  78.         HRESULT hresult;
  79.  
  80.         hresult = CAVIFileCF::Create(rclsid, riid, ppv);
  81.         return hresult;
  82. }
  83.  
  84. /*      -       -       -       -       -       -       -       -       */
  85.  
  86. HRESULT CAVIFileCF::Create(
  87.         const CLSID FAR&        rclsid,
  88.         const IID FAR&  riid,
  89.         void FAR* FAR*  ppv)
  90. {
  91.         CAVIFileCF FAR* pAVIFileCF;
  92.         IUnknown FAR*   pUnknown;
  93.         HRESULT hresult;
  94.  
  95.         pAVIFileCF = new FAR CAVIFileCF(rclsid, &pUnknown);
  96.         if (pAVIFileCF == NULL)
  97.                 return ResultFromScode(E_OUTOFMEMORY);
  98.         hresult = pUnknown->QueryInterface(riid, ppv);
  99.         if (FAILED(GetScode(hresult)))
  100.                 delete pAVIFileCF;
  101.         return hresult;
  102. }
  103.  
  104. /*      -       -       -       -       -       -       -       -       */
  105.  
  106. CAVIFileCF::CAVIFileCF(
  107.         const CLSID FAR&        rclsid,
  108.         IUnknown FAR* FAR*      ppUnknown)
  109. {
  110.         m_clsid = rclsid;
  111.         m_refs = 0;
  112.         *ppUnknown = this;
  113. }
  114.  
  115. /*      -       -       -       -       -       -       -       -       */
  116.  
  117. STDMETHODIMP CAVIFileCF::QueryInterface(
  118.         const IID FAR&  iid,
  119.         void FAR* FAR*  ppv)
  120. {
  121.         if (iid == IID_IUnknown)
  122.                 *ppv = this;
  123.         else if (iid == IID_IClassFactory)
  124.                 *ppv = this;
  125.         else
  126.                 return ResultFromScode(E_NOINTERFACE);
  127.         AddRef();
  128.         return NULL;
  129. }
  130.  
  131. /*      -       -       -       -       -       -       -       -       */
  132.  
  133. STDMETHODIMP_(ULONG) CAVIFileCF::AddRef()
  134. {
  135.         return ++m_refs;
  136. }
  137.  
  138. /*      -       -       -       -       -       -       -       -       */
  139.  
  140. STDMETHODIMP_(ULONG) CAVIFileCF::Release()
  141. {
  142.         if (!--m_refs) {
  143.                 delete this;
  144.                 return 0;
  145.         }
  146.         return m_refs;
  147. }
  148.  
  149. /*      -       -       -       -       -       -       -       -       */
  150.  
  151. STDMETHODIMP CAVIFileCF::CreateInstance(
  152.         IUnknown FAR*   pUnknownOuter,
  153.         const IID FAR&  riid,
  154.         void FAR* FAR*  ppv)
  155. {
  156.         HRESULT hresult;
  157.         // Actually create a real object using the CAVIFile class....
  158.  
  159.         // !!! We should really make sure they're using IAVIFile or IMarshal!
  160.         if (m_clsid == CLSID_DIBSEQFileReader) {
  161.                 hresult = CAVIFile::Create(pUnknownOuter, riid, ppv);
  162.                 return hresult;
  163.         } else {
  164.                 return ResultFromScode(E_UNEXPECTED);
  165.         }
  166. }
  167.  
  168. /*      -       -       -       -       -       -       -       -       */
  169.  
  170. STDMETHODIMP CAVIFileCF::LockServer(
  171.         BOOL    fLock)
  172. {
  173.         fLocked = fLock;
  174.         return NULL;
  175. }
  176.  
  177. /*      -       -       -       -       -       -       -       -       */
  178.