RNSO.cpp
上传用户:lianquan
上传日期:2007-01-02
资源大小:197k
文件大小:3k
源码类别:

ActiveX/DCOM/ATL

开发平台:

Visual C++

  1. // RNSO.cpp : Implementation of WinMain
  2. // Note: Proxy/Stub Information
  3. // To build a separate proxy/stub DLL, 
  4. // run nmake -f RNSOps.mk in the project directory.
  5. #include "stdafx.h"
  6. #include "resource.h"
  7. #include "initguid.h"
  8. #include "RNSO.h"
  9. #include "RNSO_i.c"
  10. #include "GenericObserver.h" #include "Manager.h"
  11. LONG CExeModule::Unlock()
  12. {
  13. LONG l = CComModule::Unlock();
  14. if (l == 0)
  15. {
  16. #if _WIN32_WINNT >= 0x0400
  17. if (CoSuspendClassObjects() == S_OK)
  18. PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
  19. #else
  20. PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
  21. #endif
  22. }
  23. return l;
  24. }
  25. CExeModule _Module;
  26. BEGIN_OBJECT_MAP(ObjectMap)
  27. OBJECT_ENTRY(CLSID_GenericObserver, CGenericObserver)
  28. END_OBJECT_MAP()
  29. LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2)
  30. {
  31. while (*p1 != NULL)
  32. {
  33. LPCTSTR p = p2;
  34. while (*p != NULL)
  35. {
  36. if (*p1 == *p++)
  37. return p1+1;
  38. }
  39. p1++;
  40. }
  41. return NULL;
  42. }
  43. /////////////////////////////////////////////////////////////////////////////
  44. //
  45. extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, 
  46. HINSTANCE /*hPrevInstance*/, LPTSTR lpCmdLine, int /*nShowCmd*/)
  47. {
  48. lpCmdLine = GetCommandLine(); //this line necessary for _ATL_MIN_CRT
  49. //HRESULT hRes = CoInitialize(NULL);
  50. HRESULT hRes = CoInitializeEx(NULL,COINIT_MULTITHREADED);
  51. //  If you are running on NT 4.0 or higher you can use the following call
  52. // instead to make the EXE free threaded.
  53. //  This means that calls come in on a random RPC thread
  54. // HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
  55. _ASSERTE(SUCCEEDED(hRes));
  56. _Module.Init(ObjectMap, hInstance);
  57. _Module.dwThreadID = GetCurrentThreadId();
  58. TCHAR szTokens[] = _T("-/");
  59. int nRet = 0;
  60. BOOL bRun = TRUE;
  61. LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
  62. while (lpszToken != NULL)
  63. {
  64. if (lstrcmpi(lpszToken, _T("UnregServer"))==0)
  65. {
  66. _Module.UpdateRegistryFromResource(IDR_RNSO, FALSE);
  67. nRet = _Module.UnregisterServer();
  68. bRun = FALSE;
  69. break;
  70. }
  71. if (lstrcmpi(lpszToken, _T("RegServer"))==0)
  72. {
  73. _Module.UpdateRegistryFromResource(IDR_RNSO, TRUE);
  74. nRet = _Module.RegisterServer(TRUE);
  75. bRun = FALSE;
  76. break;
  77. }
  78. lpszToken = FindOneOf(lpszToken, szTokens);
  79. }
  80. if (bRun)
  81. {
  82. GenericManager::StartManager();
  83. hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, 
  84. REGCLS_MULTIPLEUSE);
  85. _ASSERTE(SUCCEEDED(hRes));
  86. MSG msg;
  87. while (GetMessage(&msg, 0, 0, 0))
  88. DispatchMessage(&msg);
  89. _Module.RevokeClassObjects();
  90. GenericManager::StopManager();
  91. }
  92. CoUninitialize();
  93. return nRet;
  94. }