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

Windows编程

开发平台:

Visual C++

  1. // duck.cpp : Implementation of WinMain
  2. //
  3. // This is a part of the Active Template Library.
  4. // Copyright (C) 1996-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Active Template Library Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Active Template Library product.
  12. // Note: Proxy/Stub Information
  13. //      To build a separate proxy/stub DLL,
  14. //      run nmake -f duckps.mk in the project directory.
  15. #include "stdafx.h"
  16. #include "resource.h"
  17. #include "initguid.h"
  18. #include "duck.h"
  19. #include "mydlg.h"
  20. #include "duck_i.c"
  21. #include "duckint.h"
  22. LONG CExeModule::Unlock()
  23. {
  24. LONG l = CComModule::Unlock();
  25. if (l == 0)
  26. {
  27. #if _WIN32_WINNT >= 0x0400
  28. if (CoSuspendClassObjects() == S_OK)
  29. PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
  30. #else
  31. PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
  32. #endif
  33. }
  34. return l;
  35. }
  36. CExeModule _Module;
  37. BEGIN_OBJECT_MAP(ObjectMap)
  38. OBJECT_ENTRY(CLSID_DuckInt, CDuckInt)
  39. END_OBJECT_MAP()
  40. LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2)
  41. {
  42. while (*p1 != NULL)
  43. {
  44. LPCTSTR p = p2;
  45. while (*p != NULL)
  46. {
  47. if (*p1 == *p++)
  48. return p1+1;
  49. }
  50. p1++;
  51. }
  52. return NULL;
  53. }
  54. CMyDlg mydlg;
  55. /////////////////////////////////////////////////////////////////////////////
  56. //
  57. extern "C" int WINAPI _tWinMain(HINSTANCE hInstance,
  58. HINSTANCE /*hPrevInstance*/, LPTSTR lpCmdLine, int /*nShowCmd*/)
  59. {
  60. lpCmdLine = GetCommandLine(); //this line necessary for _ATL_MIN_CRT
  61. HRESULT hRes = CoInitialize(NULL);
  62. //  If you are running on NT 4.0 or higher you can use the following call
  63. //  instead to make the EXE free threaded.
  64. //  This means that calls come in on a random RPC thread
  65. //  HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
  66. _ASSERTE(SUCCEEDED(hRes));
  67. _Module.Init(ObjectMap, hInstance);
  68. _Module.dwThreadID = GetCurrentThreadId();
  69. TCHAR szTokens[] = _T("-/");
  70. int nRet = 0;
  71. BOOL bRun = TRUE;
  72. LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
  73. while (lpszToken != NULL)
  74. {
  75. if (lstrcmpi(lpszToken, _T("UnregServer"))==0)
  76. {
  77. _Module.UpdateRegistryFromResource(IDR_Duck, FALSE);
  78. nRet = _Module.UnregisterServer();
  79. bRun = FALSE;
  80. break;
  81. }
  82. if (lstrcmpi(lpszToken, _T("RegServer"))==0)
  83. {
  84. _Module.UpdateRegistryFromResource(IDR_Duck, TRUE);
  85. nRet = _Module.RegisterServer(TRUE);
  86. bRun = FALSE;
  87. break;
  88. }
  89. lpszToken = FindOneOf(lpszToken, szTokens);
  90. }
  91. if (bRun)
  92. {
  93. hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER,
  94. REGCLS_MULTIPLEUSE);
  95. _ASSERTE(SUCCEEDED(hRes));
  96. mydlg.DoModal();
  97. _Module.RevokeClassObjects();
  98. }
  99. CoUninitialize();
  100. #ifdef _ATL_MIN_CRT
  101. ExitProcess(nRet);
  102. #else
  103. return nRet;
  104. #endif
  105. }