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 / handler.h < prev    next >
Encoding:
C/C++ Source or Header  |  1997-10-05  |  11.3 KB  |  323 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. extern HMODULE ghModule; // = NULL; // global HMODULE/HINSTANCE for resource access
  12.  
  13. // Comment out the following line to disable the custom marshalling code....
  14. #define CUSTOMMARSHAL
  15.  
  16. /*      -       -       -       -       -       -       -       -       */
  17.  
  18. #define CFactoryImpl    CI      // MSC7 Can't handle long exported names
  19. #define CAVIFileImpl    CF      // MSC7 Can't handle long exported names
  20. #define CAVIStreamImpl  CS      // MSC7 Can't handle long exported names
  21.  
  22. /* Remove warning of using object during initialization. */
  23. #pragma warning(disable:4355)
  24.  
  25. /*      -       -       -       -       -       -       -       -       */
  26.  
  27. #define implement       struct
  28. #define implementations private
  29.  
  30. /*
  31. ** _StdClassImplementations
  32. ** Defines the standard implementations for a class object.
  33. */
  34.  
  35. #define _StdClassImplementations(Impl)  \
  36.         STDMETHODIMP QueryInterface(const IID FAR& riid, void FAR* FAR* ppv);   \
  37.         STDMETHODIMP_(ULONG) AddRef();  \
  38.         STDMETHODIMP_(ULONG) Release()
  39.  
  40.  
  41. // non-member function prototypes
  42. EXTERN_C BOOL PASCAL FAR LibMain(
  43.         HINSTANCE       hInstance,
  44.         HGLOBAL segDS,
  45.         UINT    cbHeapSize,
  46.         LPCSTR  pszCmdLine);
  47. EXTERN_C BOOL FAR PASCAL WEP(
  48.         BOOL    fSystemExit);
  49. STDAPI DllCanUnloadNow(
  50.         void);
  51. STDAPI DllGetClassObject(
  52.         const CLSID FAR&        rclsid,
  53.         const IID FAR&  riid,
  54.         void FAR* FAR*  ppv);
  55. LPSTR FAR FileName(
  56.         LPCSTR lszPath);
  57.  
  58. /*      -       -       -       -       -       -       -       -       */
  59. class FAR CAVIFileCF : IClassFactory {
  60. public:
  61.         static HRESULT Create(const CLSID FAR& rclsid, const IID FAR& riid, void FAR* FAR* ppv);
  62. private:
  63.         CAVIFileCF(const CLSID FAR& rclsid, IUnknown FAR* FAR* ppUnknown);
  64.         _StdClassImplementations(CFactoryImpl);
  65.         CFactoryImpl(CAVIFileCF FAR* pAVIFileCF);
  66.         STDMETHODIMP CreateInstance(IUnknown FAR* pUnknownOuter, const IID FAR& riid, void FAR* FAR* ppv);
  67.         STDMETHODIMP LockServer(BOOL fLock);
  68.  
  69.         ULONG   m_refs;
  70.         CLSID   m_clsid;
  71. };
  72.  
  73. /*      -       -       -       -       -       -       -       -       */
  74.  
  75. class FAR CAVIFile {
  76. public:
  77.         static HRESULT Create(IUnknown FAR* pUnknownOuter, const IID FAR& riid, void FAR* FAR* ppv);
  78.         HRESULT NEAR PASCAL LoadFrame(LONG lPos);
  79.         HRESULT NEAR PASCAL WriteFrame(LONG lPos, LPVOID lp, LONG cb);
  80.  
  81. private:
  82.         CAVIFile(IUnknown FAR* pUnknownOuter, IUnknown FAR* FAR* ppUnknown);
  83.  
  84. implementations:
  85.         implement CUnknownImpl : IUnknown {
  86.         public:
  87.                 _StdClassImplementations(
  88.                         CUnknownImpl);
  89.                 CUnknownImpl(
  90.                         CAVIFile FAR* pAVIFile);
  91.         private:
  92.                 CAVIFile FAR*   m_pAVIFile;
  93.                 ULONG   m_refs;
  94.         };
  95.         implement CAVIFileImpl : IAVIFile {
  96.         public:
  97.                 _StdClassImplementations(
  98.                         CAVIFileImpl);
  99.                 CAVIFileImpl(
  100.                         CAVIFile FAR* pAVIFile);
  101.                 ~CAVIFileImpl();
  102.                 STDMETHODIMP Info(
  103.                         THIS_
  104.                         AVIFILEINFOW * pfi,
  105.                         LONG lSize);
  106.                 STDMETHODIMP GetStream(
  107.                         THIS_
  108.                         PAVISTREAM FAR * ppStream,
  109.                         DWORD fccType,
  110.                         LONG lParam);
  111.                 STDMETHODIMP CreateStream(
  112.                         THIS_
  113.                         PAVISTREAM FAR * ppStream,
  114.                         AVISTREAMINFOW * psi);
  115.                 STDMETHODIMP WriteData(
  116.                         THIS_
  117.                         DWORD ckid,
  118.                         LPVOID lpData,
  119.                         LONG cbData);
  120.                 STDMETHODIMP ReadData(
  121.                         THIS_
  122.                         DWORD ckid,
  123.                         LPVOID lpData,
  124.                         LONG FAR *lpcbData);
  125.                 STDMETHODIMP EndRecord(
  126.                         THIS);
  127.                 STDMETHODIMP DeleteStream(THIS_
  128.                                             DWORD fccType,
  129.                                             LONG lParam);
  130.         private:
  131.                 // private functions here?
  132.                 CAVIFile FAR*   m_pAVIFile;
  133.         };
  134.         implement CAVIStreamImpl : IAVIStream {
  135.         public:
  136.                 _StdClassImplementations(
  137.                         CAVIStreamImpl);
  138.                 CAVIStreamImpl(
  139.                         CAVIFile FAR* pAVIFile);
  140.                 ~CAVIStreamImpl();
  141.                 STDMETHODIMP Create(
  142.                         THIS_
  143.                         LPARAM lParam1,
  144.                         LPARAM lParam2);
  145.                 STDMETHODIMP Info(
  146.                         THIS_
  147.                         AVISTREAMINFOW FAR * psi,
  148.                         LONG lSize);
  149.                 STDMETHODIMP_(LONG) FindSample(
  150.                         THIS_
  151.                         LONG lPos,
  152.                         LONG lFlags);
  153.                 STDMETHODIMP ReadFormat(
  154.                         THIS_
  155.                         LONG lPos,
  156.                         LPVOID lpFormat,
  157.                         LONG FAR *cbFormat);
  158.                 STDMETHODIMP SetFormat(
  159.                         THIS_
  160.                         LONG lPos,
  161.                         LPVOID lpFormat,
  162.                         LONG cbFormat);
  163.                 STDMETHODIMP Read(
  164.                         THIS_
  165.                         LONG lStart,
  166.                         LONG lSamples,
  167.                         LPVOID lpBuffer,
  168.                         LONG cbBuffer,
  169.                         LONG FAR * plBytes,
  170.                         LONG FAR * plSamples);
  171.                 STDMETHODIMP Write(
  172.                         THIS_
  173.                         LONG lStart,
  174.                         LONG lSamples,
  175.                         LPVOID lpBuffer,
  176.                         LONG cbBuffer,
  177.                         DWORD dwFlags,
  178.                         LONG FAR *plSampWritten,
  179.                         LONG FAR *plBytesWritten);
  180.                 STDMETHODIMP Delete(
  181.                         THIS_
  182.                         LONG lStart,
  183.                         LONG lSamples);
  184.                 STDMETHODIMP ReadData(
  185.                         THIS_
  186.                         DWORD fcc,
  187.                         LPVOID lp,
  188.                         LONG FAR *lpcb);
  189.                 STDMETHODIMP WriteData(
  190.                         THIS_
  191.                         DWORD fcc,
  192.                         LPVOID lp,
  193.                         LONG cb);
  194.                 STDMETHODIMP SetInfo(AVISTREAMINFOW FAR * lpInfo, LONG cbInfo);
  195.         private:
  196.                 // private functions here?
  197.                 CAVIFile FAR*   m_pAVIFile;
  198.         };
  199.  
  200.         implement CPersistFileImpl : IPersistFile {
  201.         public:
  202.             CPersistFileImpl(CAVIFile FAR* pAVIFile);
  203.             STDMETHODIMP QueryInterface(REFIID riid, LPVOID FAR* ppv);
  204.             STDMETHODIMP_(ULONG) AddRef();
  205.             STDMETHODIMP_(ULONG) Release();
  206.  
  207.             // *** IPersist methods ***
  208.             STDMETHODIMP GetClassID (LPCLSID lpClassID);
  209.  
  210.             // *** IPersistFile methods ***
  211.             STDMETHODIMP IsDirty ();
  212.             STDMETHODIMP Load (LPCOLESTR lpszFileName, DWORD grfMode);
  213.             STDMETHODIMP Save (LPCOLESTR lpszFileName, BOOL fRemember);
  214.             STDMETHODIMP SaveCompleted (LPCOLESTR lpszFileName);
  215.             STDMETHODIMP GetCurFile (LPOLESTR FAR * lplpszFileName);
  216.  
  217.         private:
  218.             CAVIFile FAR*       m_pAVIFile;
  219.         };
  220.  
  221.  
  222. #ifdef CUSTOMMARSHAL
  223.         implement CMarshalImpl : IMarshal {
  224.         public:
  225.                 _StdClassImplementations(
  226.                         CMarshalImpl);
  227.                 CMarshalImpl(
  228.                         CAVIFile FAR* pAVIFile);
  229.                 // *** IMarshal methods ***
  230.                 STDMETHODIMP GetUnmarshalClass (
  231.                         THIS_
  232.                         REFIID riid,
  233.                         LPVOID pv,
  234.                         DWORD dwDestContext,
  235.                         LPVOID pvDestContext,
  236.                         DWORD mshlflags,
  237.                         LPCLSID pCid);
  238.                 STDMETHODIMP GetMarshalSizeMax (
  239.                         THIS_
  240.                         REFIID riid,
  241.                         LPVOID pv,
  242.                         DWORD dwDestContext,
  243.                         LPVOID pvDestContext,
  244.                         DWORD mshlflags,
  245.                         LPDWORD pSize);
  246.                 STDMETHODIMP MarshalInterface(
  247.                         THIS_
  248.                         LPSTREAM pStm,
  249.                         REFIID riid,
  250.                         LPVOID pv,
  251.                         DWORD dwDestContext,
  252.                         LPVOID pvDestContext,
  253.                         DWORD mshlflags);
  254.                 STDMETHODIMP UnmarshalInterface (
  255.                         THIS_
  256.                         LPSTREAM pStm,
  257.                         REFIID riid,
  258.                         LPVOID FAR* ppv);
  259.                 STDMETHODIMP ReleaseMarshalData (
  260.                         THIS_
  261.                         LPSTREAM pStm);
  262.                 STDMETHODIMP DisconnectObject (
  263.                 THIS_
  264.                 DWORD dwReserved);
  265.         private:
  266.                 CAVIFile FAR*   m_pAVIFile;
  267.         };
  268. #endif
  269. public:
  270.         CUnknownImpl    m_Unknown;
  271.         CAVIFileImpl    m_AVIFile;
  272.         CAVIStreamImpl  m_AVIStream;
  273.         CPersistFileImpl m_Persist;
  274. #ifdef CUSTOMMARSHAL
  275.         CMarshalImpl    m_Marshal;
  276. #endif
  277. public:
  278.         IUnknown FAR*   m_pUnknownOuter;
  279.  
  280.         //
  281.         // DIB Sequence instance data
  282.         //
  283.         DWORD   dwFirstFrame;
  284.         DWORD   dwMaxValue;
  285. #ifndef _MAX_PATH
  286.         #define _MAX_PATH       260
  287. #else
  288.         #if _MAX_PATH !=        260     // Error check
  289.                 #error
  290.         #endif
  291. #endif
  292.         char    achFilenameTemplate[_MAX_PATH];
  293.         LONG    lCurFrame;
  294.         AVIFILEINFO     finfo;
  295.         AVISTREAMINFOW sinfo;
  296.  
  297.         BOOL    fStreamPresent;
  298.         LPVOID  lpFormat;       // stream format
  299.         LONG    cbFormat;
  300.         LONG    cbFormatBuffer;
  301.         LPVOID  lpFrame;
  302.         LONG    cbFrame;
  303.         LONG    cbFrameBuffer;
  304.         BOOL    fDirty;
  305.         UINT    mode;
  306. };
  307.  
  308. /*      -       -       -       -       -       -       -       -       */
  309.  
  310. /*
  311. ** The usage counter keeps track of the overall usage of objects based on
  312. ** implementations provided by the component. This allows one to determine
  313. ** when the implementation is no longer in use.
  314. */
  315.  
  316. extern UINT     uUseCount;
  317. extern BOOL     fLocked;
  318.  
  319. /*      -       -       -       -       -       -       -       -       */
  320.  
  321.  
  322. DEFINE_AVIGUID(CLSID_DIBSEQFileReader, 0x00020006, 0, 0);
  323.