home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / atl / atlduck / atlduck.cpp < prev    next >
C/C++ Source or Header  |  1998-03-26  |  3KB  |  129 lines

  1. // atlduck.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.  
  13. // Note: Proxy/Stub Information
  14. //      To build a separate proxy/stub DLL,
  15. //      run nmake -f atlduckps.mk in the project directory.
  16.  
  17. #include "stdafx.h"
  18. #include "resource.h"
  19. #include "initguid.h"
  20. #include "atlduck.h"
  21.  
  22. #include "atlduck_i.c"
  23. #include "DuckDoer.h"
  24.  
  25.  
  26. LONG CExeModule::Unlock()
  27. {
  28.     LONG l = CComModule::Unlock();
  29.     if (l == 0)
  30.     {
  31. #if _WIN32_WINNT >= 0x0400
  32.         if (CoSuspendClassObjects() == S_OK)
  33.             PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
  34. #else
  35.         PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
  36. #endif
  37.     }
  38.     return l;
  39. }
  40.  
  41. CExeModule _Module;
  42.  
  43. BEGIN_OBJECT_MAP(ObjectMap)
  44.     OBJECT_ENTRY(CLSID_DuckDoer, CDuckDoer)
  45. END_OBJECT_MAP()
  46.  
  47.  
  48. LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2)
  49. {
  50.     while (*p1 != NULL)
  51.     {
  52.         LPCTSTR p = p2;
  53.         while (*p != NULL)
  54.         {
  55.             if (*p1 == *p++)
  56.                 return p1+1;
  57.         }
  58.         p1++;
  59.     }
  60.     return NULL;
  61. }
  62.  
  63. /////////////////////////////////////////////////////////////////////////////
  64. //
  65. extern "C" int WINAPI _tWinMain(HINSTANCE hInstance,
  66.     HINSTANCE /*hPrevInstance*/, LPTSTR lpCmdLine, int /*nShowCmd*/)
  67. {
  68.     lpCmdLine = GetCommandLine(); //this line necessary for _ATL_MIN_CRT
  69.     HRESULT hRes = CoInitialize(NULL);
  70. //  If you are running on NT 4.0 or higher you can use the following call
  71. //  instead to make the EXE free threaded.
  72. //  This means that calls come in on a random RPC thread
  73. //  HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
  74.     _ASSERTE(SUCCEEDED(hRes));
  75.     _Module.Init(ObjectMap, hInstance);
  76.     _Module.dwThreadID = GetCurrentThreadId();
  77.     TCHAR szTokens[] = _T("-/");
  78.  
  79.     int nRet = 0;
  80.     BOOL bRun = TRUE;
  81.     LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
  82.     while (lpszToken != NULL)
  83.     {
  84.         if (lstrcmpi(lpszToken, _T("UnregServer"))==0)
  85.         {
  86.             _Module.UpdateRegistryFromResource(IDR_Atlduck, FALSE);
  87.             nRet = _Module.UnregisterServer();
  88.             bRun = FALSE;
  89.             break;
  90.         }
  91.         if (lstrcmpi(lpszToken, _T("RegServer"))==0)
  92.         {
  93.             _Module.UpdateRegistryFromResource(IDR_Atlduck, TRUE);
  94.             nRet = _Module.RegisterServer(TRUE);
  95.             bRun = FALSE;
  96.             break;
  97.         }
  98.         lpszToken = FindOneOf(lpszToken, szTokens);
  99.     }
  100.  
  101.     if (bRun)
  102.     {
  103.         // create a modeless dialog to be displayed
  104.         _ASSERT(CDuckDoer::m_pDlg == NULL);
  105.         CDuckDoer::m_pDlg = new CDuckDoerDlg();
  106.         CDuckDoer::m_pDlg->Create(NULL);
  107.         CDuckDoer::m_pDlg->ShowWindow(SW_SHOWNORMAL);
  108.         _ASSERT(CDuckDoer::m_pDlg != NULL);
  109.  
  110.         hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER,
  111.             REGCLS_MULTIPLEUSE);
  112.         _ASSERTE(SUCCEEDED(hRes));
  113.  
  114.  
  115.         MSG msg;
  116.         while (GetMessage(&msg, 0, 0, 0))
  117.             DispatchMessage(&msg);
  118.  
  119.         _Module.RevokeClassObjects();
  120.     }
  121.  
  122.     CoUninitialize();
  123. #ifdef _ATL_MIN_CRT
  124.     ExitProcess(nRet);
  125. #else
  126.     return nRet;
  127. #endif
  128. }
  129.