OLEDBATLEnumerator.cpp
上传用户:benben_wyd
上传日期:2010-02-26
资源大小:1229k
文件大小:4k
源码类别:

书籍源码

开发平台:

Visual C++

  1. // OLEDBATLEnumerator.cpp : Implementation of WinMain
  2. // Note: Proxy/Stub Information
  3. //      To build a separate proxy/stub DLL, 
  4. //      run nmake -f OLEDBATLEnumeratorps.mk in the project directory.
  5. #include "stdafx.h"
  6. #include "resource.h"
  7. #include <initguid.h>
  8. #include "OLEDBATLEnumerator.h"
  9. #include "OLEDBATLEnumerator_i.c"
  10. //Added by Chuck Wood for dialog box support
  11. #include "EnumDialog.h"
  12. const DWORD dwTimeOut = 5000; // time for EXE to be idle before shutting down
  13. const DWORD dwPause = 1000; // time to wait for threads to finish up
  14. // Passed to CreateThread to monitor the shutdown event
  15. static DWORD WINAPI MonitorProc(void* pv)
  16. {
  17.     CExeModule* p = (CExeModule*)pv;
  18.     p->MonitorShutdown();
  19.     return 0;
  20. }
  21. LONG CExeModule::Unlock()
  22. {
  23.     LONG l = CComModule::Unlock();
  24.     if (l == 0)
  25.     {
  26.         bActivity = true;
  27.         SetEvent(hEventShutdown); // tell monitor that we transitioned to zero
  28.     }
  29.     return l;
  30. }
  31. //Monitors the shutdown event
  32. void CExeModule::MonitorShutdown()
  33. {
  34.     while (1)
  35.     {
  36.         WaitForSingleObject(hEventShutdown, INFINITE);
  37.         DWORD dwWait=0;
  38.         do
  39.         {
  40.             bActivity = false;
  41.             dwWait = WaitForSingleObject(hEventShutdown, dwTimeOut);
  42.         } while (dwWait == WAIT_OBJECT_0);
  43.         // timed out
  44.         if (!bActivity && m_nLockCnt == 0) // if no activity let's really bail
  45.         {
  46. #if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
  47.             CoSuspendClassObjects();
  48.             if (!bActivity && m_nLockCnt == 0)
  49. #endif
  50.                 break;
  51.         }
  52.     }
  53.     CloseHandle(hEventShutdown);
  54.     PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
  55. }
  56. bool CExeModule::StartMonitor()
  57. {
  58.     hEventShutdown = CreateEvent(NULL, false, false, NULL);
  59.     if (hEventShutdown == NULL)
  60.         return false;
  61.     DWORD dwThreadID;
  62.     HANDLE h = CreateThread(NULL, 0, MonitorProc, this, 0, &dwThreadID);
  63.     return (h != NULL);
  64. }
  65. CExeModule _Module;
  66. BEGIN_OBJECT_MAP(ObjectMap)
  67. END_OBJECT_MAP()
  68. LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2)
  69. {
  70.     while (p1 != NULL && *p1 != NULL)
  71.     {
  72.         LPCTSTR p = p2;
  73.         while (p != NULL && *p != NULL)
  74.         {
  75.             if (*p1 == *p)
  76.                 return CharNext(p1);
  77.             p = CharNext(p);
  78.         }
  79.         p1 = CharNext(p1);
  80.     }
  81.     return NULL;
  82. }
  83. /////////////////////////////////////////////////////////////////////////////
  84. //
  85. extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, 
  86.     HINSTANCE /*hPrevInstance*/, LPTSTR lpCmdLine, int /*nShowCmd*/)
  87. {
  88.     lpCmdLine = GetCommandLine(); //this line necessary for _ATL_MIN_CRT
  89. #if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
  90.     HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
  91. #else
  92.     HRESULT hRes = CoInitialize(NULL);
  93. #endif
  94.     _ASSERTE(SUCCEEDED(hRes));
  95.     _Module.Init(ObjectMap, hInstance, &LIBID_OLEDBATLENUMERATORLib);
  96.     _Module.dwThreadID = GetCurrentThreadId();
  97.     TCHAR szTokens[] = _T("-/");
  98.     int nRet = 0;
  99.     BOOL bRun = TRUE;
  100.     LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
  101.     while (lpszToken != NULL)
  102.     {
  103.         if (lstrcmpi(lpszToken, _T("UnregServer"))==0)
  104.         {
  105.             _Module.UpdateRegistryFromResource(IDR_OLEDBATLEnumerator, FALSE);
  106.             nRet = _Module.UnregisterServer(TRUE);
  107.             bRun = FALSE;
  108.             break;
  109.         }
  110.         if (lstrcmpi(lpszToken, _T("RegServer"))==0)
  111.         {
  112.             _Module.UpdateRegistryFromResource(IDR_OLEDBATLEnumerator, TRUE);
  113.             nRet = _Module.RegisterServer(TRUE);
  114.             bRun = FALSE;
  115.             break;
  116.         }
  117.         lpszToken = FindOneOf(lpszToken, szTokens);
  118.     }
  119.     if (bRun)
  120.     {
  121.         _Module.StartMonitor();
  122. #if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
  123.         hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, 
  124.             REGCLS_MULTIPLEUSE | REGCLS_SUSPENDED);
  125.         _ASSERTE(SUCCEEDED(hRes));
  126.         hRes = CoResumeClassObjects();
  127. #else
  128.         hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, 
  129.             REGCLS_MULTIPLEUSE);
  130. #endif
  131.         _ASSERTE(SUCCEEDED(hRes));
  132. //Added by Chuck Wood to open the dialog box
  133. CEnumDialog c;
  134.         _Module.RevokeClassObjects();
  135.         Sleep(dwPause); //wait for any threads to finish
  136.     }
  137.     _Module.Term();
  138.     CoUninitialize();
  139.     return nRet;
  140. }