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

Windows编程

开发平台:

Visual C++

  1. // Driver.h : Declaration of the CRandomEvent
  2. #include "mdrivres.h"       // main symbols
  3. #include <afxtempl.h>
  4. /////////////////////////////////////////////////////////////////////////////
  5. // Drive
  6. struct foo
  7. {
  8.     foo() {nPos = 0;nDir=1;}
  9.     int nPos;
  10.     int nDir;
  11. };
  12. class CCriticalSection
  13. {
  14. public:
  15.     void Lock() { EnterCriticalSection(&m_sec); }
  16.     void Unlock() { LeaveCriticalSection(&m_sec); }
  17.     CCriticalSection() { InitializeCriticalSection(&m_sec); } 
  18.     ~CCriticalSection() { DeleteCriticalSection(&m_sec); }
  19.     CRITICAL_SECTION m_sec;
  20. };
  21. extern LONG g_cObjCnt;
  22. class CRandomEvent : public IRandomEvent
  23. {
  24. public:
  25.     CRandomEvent() { m_cnt = 0L; m_nID = 0; }
  26.     STDMETHOD(GetTypeInfoCount)(UINT*) { return E_NOTIMPL; }
  27.     STDMETHOD(GetTypeInfo)(UINT, LCID, ITypeInfo**) { return E_NOTIMPL; }
  28.     STDMETHOD(GetIDsOfNames)(REFIID, LPOLESTR*, UINT, LCID, DISPID*) { return E_NOTIMPL; }
  29.     STDMETHOD(Invoke)(DISPID, REFIID, LCID, WORD, DISPPARAMS*, VARIANT*, EXCEPINFO*, UINT*) { return E_NOTIMPL; }
  30.     STDMETHOD(QueryInterface)(REFIID iid, LPVOID* ppv)
  31.     { 
  32.         if ((iid == __uuidof(IRandomEvent)) ||
  33.         (iid == __uuidof(IDispatch)) ||
  34.         (iid == __uuidof(IUnknown)))
  35.             *ppv = this;
  36.         else
  37.         {
  38.             *ppv = 0;
  39.             return E_NOINTERFACE;
  40.         }
  41.         AddRef();
  42.         return S_OK;
  43.     }
  44.     STDMETHOD_(ULONG,AddRef)() { return InterlockedIncrement(&m_cnt); }
  45.     STDMETHOD_(ULONG,Release)()
  46.     { 
  47.     InterlockedDecrement(&m_cnt);
  48.     if (m_cnt != 0)
  49.         return m_cnt;
  50.     InterlockedDecrement(&g_cObjCnt);
  51.     delete this;
  52.     return 0;
  53.     }
  54.         
  55. // IRandomEvent
  56.     STDMETHOD(put_Fire)(long l);
  57.     STDMETHOD(put_ID)(int n) { m_nID = n; return S_OK; }
  58. private:
  59. // data
  60.     LONG m_cnt;    
  61.     int m_nID;
  62.     CMap<long, long, foo, foo> m_mapPos;
  63.     CCriticalSection m_cs;
  64. };
  65. // NOTE: CRandomEventClassFactory is not necessary for this example, one can just use new
  66. extern LONG g_cLockCnt;
  67. interface CRandomEventClassFactory : public IClassFactory
  68. {
  69. public:
  70.     CRandomEventClassFactory() { m_cnt = 0L; }
  71.     STDMETHOD(CreateInstance)(IUnknown* pUnkOuter, REFIID riid, void** ppvObject)
  72.     {
  73.         *ppvObject=NULL;
  74.         if (pUnkOuter != 0)
  75.             return CLASS_E_NOAGGREGATION;
  76.         CRandomEvent* pRandomEvent = new CRandomEvent;
  77.         if (pRandomEvent == 0)
  78.             return E_OUTOFMEMORY;
  79.         HRESULT hr = pRandomEvent->QueryInterface(riid, ppvObject);
  80.         if (FAILED(hr))
  81.             delete pRandomEvent;
  82.         else
  83.             InterlockedIncrement(&g_cObjCnt);
  84.         return hr;
  85.     }
  86.         
  87.     STDMETHOD(LockServer)(BOOL fLock)
  88.     {
  89.         if (fLock)
  90.             InterlockedIncrement(&g_cLockCnt);
  91.         else
  92.             InterlockedDecrement(&g_cLockCnt);
  93.         return S_OK;
  94.     }     
  95.     STDMETHOD(QueryInterface)(REFIID iid, LPVOID* ppv)
  96.     { 
  97.         if ((iid == __uuidof(IClassFactory)) ||
  98.         (iid == __uuidof(IUnknown)))
  99.             *ppv = this;
  100.         else
  101.         {
  102.             *ppv = 0;
  103.             return E_NOINTERFACE;
  104.         }
  105.         AddRef();
  106.         return S_OK;
  107.     }
  108.     STDMETHOD_(ULONG,AddRef)() { return InterlockedIncrement(&m_cnt); }
  109.     STDMETHOD_(ULONG,Release)()
  110.     {  
  111.     InterlockedDecrement(&m_cnt);
  112.     if (m_cnt != 0)
  113.         return m_cnt;
  114.     delete this;
  115.     return 0;
  116.     } 
  117. private:
  118.     LONG m_cnt;
  119. };
  120. /////////////////////////////////////////////////////////////////////////////