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

Windows编程

开发平台:

Visual C++

  1. // Drive.cpp : Implementation of WinMain
  2. // You will need the NT SUR Beta 2 SDK or VC 4.2 in order to build this 
  3. // project.  This is because you will need MIDL 3.00.15 or higher and new
  4. // headers and libs.  If you have VC 4.2 installed, then everything should
  5. // already be configured correctly.
  6. #include "predrive.h"
  7. void dump_com_error(_com_error &e)
  8. {
  9.     _tprintf(_T("Oops - hit an error!n"));
  10.     _tprintf(_T("atCode = %08lxn"), e.Error());
  11.     _tprintf(_T("atCode meaning = %sn"), e.ErrorMessage());
  12.     _bstr_t bstrSource(e.Source());
  13.     _bstr_t bstrDescription(e.Description());
  14.     _tprintf(_T("atSource = %sn"), (LPCTSTR) bstrSource);
  15.     _tprintf(_T("atDescription = %sn"), (LPCTSTR) bstrDescription);
  16. }
  17. class CCriticalSection
  18. {
  19. public:
  20.     void Lock() { EnterCriticalSection(&m_sec); }
  21.     void Unlock() { LeaveCriticalSection(&m_sec); }
  22.     CCriticalSection() { InitializeCriticalSection(&m_sec); } 
  23.     ~CCriticalSection() { DeleteCriticalSection(&m_sec); }
  24.     CRITICAL_SECTION m_sec;
  25. };
  26. extern LONG g_cObjCnt;
  27. class CRandomEvent : public IRandomEvent
  28. {
  29. public:
  30.     CRandomEvent() { m_cnt = 0L; }
  31.     STDMETHOD(GetTypeInfoCount)(UINT*) { return E_NOTIMPL; }
  32.     STDMETHOD(GetTypeInfo)(UINT, LCID, ITypeInfo**) { return E_NOTIMPL; }
  33.     STDMETHOD(GetIDsOfNames)(REFIID, LPOLESTR*, UINT, LCID, DISPID*) { return E_NOTIMPL; }
  34.     STDMETHOD(Invoke)(DISPID, REFIID, LCID, WORD, DISPPARAMS*, VARIANT*, EXCEPINFO*, UINT*) { return E_NOTIMPL; }
  35.     STDMETHOD(QueryInterface)(REFIID iid, LPVOID* ppv)
  36.     { 
  37.         if ((iid == __uuidof(IRandomEvent)) ||
  38.         (iid == __uuidof(IDispatch)) ||
  39.         (iid == __uuidof(IUnknown)))
  40.             *ppv = this;
  41.         else
  42.         {
  43.             *ppv = 0;
  44.             return E_NOINTERFACE;
  45.         }
  46.         AddRef();
  47.         return S_OK;
  48.     }
  49.     STDMETHOD_(ULONG,AddRef)() { return InterlockedIncrement(&m_cnt); }
  50.     STDMETHOD_(ULONG,Release)()
  51.     { 
  52.     InterlockedDecrement(&m_cnt);
  53.     if (m_cnt != 0)
  54.         return m_cnt;
  55.     InterlockedDecrement(&g_cObjCnt);
  56.     delete this;
  57.     return 0;
  58.     }
  59.         
  60. // IRandomEvent
  61.     STDMETHOD(put_Fire)(long l)
  62.     {
  63.         m_cs.Lock();
  64.         // Fake out multiple conection points
  65.         static cnt = 0;
  66.         _tprintf(_T("%dn"), cnt++);
  67.         m_cs.Unlock();
  68.         return S_OK;
  69.     }
  70.     STDMETHOD(put_ID)(int n) { return S_OK; }
  71. private:
  72. // data
  73.     LONG m_cnt;    
  74.     CCriticalSection m_cs;
  75. };
  76. /////////////////////////////////////////////////////////////////////////////
  77. //
  78. // Force template instantiation outside C-linkage
  79. int Drive()
  80. {
  81.     CoInitializeEx(NULL, COINIT_MULTITHREADED);
  82.     try {
  83.     IRandomPtr pM(__uuidof(CoRandom));
  84.     long nID;
  85.     nID = pM->Start;
  86.     DWORD dwTick = GetTickCount();
  87.     while (GetTickCount()-dwTick < 3000)
  88.     {   
  89.         // Fake out CoCreateInstance
  90.         CRandomEvent* pRandomEvent = new CRandomEvent;
  91.         assert(pRandomEvent != NULL);
  92.         InterlockedIncrement(&g_cObjCnt);
  93.         pRandomEvent->AddRef();
  94.         DWORD dwAdvise = 0;
  95.         IConnectionPointContainerPtr pCPC;
  96.         IConnectionPointPtr pCP;
  97.         pCPC = pM;
  98.         if (FAILED(pCPC->FindConnectionPoint(__uuidof(IRandomEvent), &pCP)))
  99.             continue;
  100.         if (FAILED(pCP->Advise(pRandomEvent, &dwAdvise)))
  101.             continue;
  102.         puts("Connect");
  103.         Sleep(1);
  104.         if (FAILED(pCP->Unadvise(dwAdvise)))
  105.             continue;
  106.         puts("Disconnect");
  107.         Sleep(1);
  108.         pRandomEvent->Release();
  109.     }
  110.     pM->Stop = nID;
  111.     pM = 0;
  112.     } catch (_com_error& e) {
  113.     dump_com_error(e);
  114.     }
  115.     assert(g_cObjCnt == 0L);
  116.     CoUninitialize();
  117.     return 0;
  118. }
  119. extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  120.     LPTSTR lpCmdLine, int nShowCmd)
  121. {
  122.     return Drive();
  123. }
  124. /////////////////////////////////////////////////////////////////////////////