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

Windows编程

开发平台:

Visual C++

  1. // AtlCont.cpp : Implementation of WinMain
  2. // You will need the NT SUR Beta 2 SDK or VC 4.2 or higher in order to build 
  3. // this 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. // Note: Proxy/Stub Information
  7. //      To build a separate proxy/stub DLL, 
  8. //      run nmake -f AtlContps.mak in the project directory.
  9. #include "stdafx.h"
  10. #include "resource.h"
  11. #include "initguid.h"
  12. #include "AtlCont.h"
  13. #define IID_DEFINED
  14. #include "AtlCont_i.c"
  15. #include "AtlCont1.h"
  16. LONG CExeModule::Unlock()
  17. {
  18.     LONG l = CComModule::Unlock();
  19.     if (l == 0)
  20.         PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
  21.     return l;
  22. }
  23. CExeModule _Module;
  24. BEGIN_OBJECT_MAP(ObjectMap)
  25.     OBJECT_ENTRY(CLSID_CAtlCont, CAtlCont)
  26. END_OBJECT_MAP()
  27. LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2)
  28. {
  29.     while (*p1 != NULL)
  30.     {
  31.         LPCTSTR p = p2;
  32.         while (*p != NULL)
  33.         {
  34.             if (*p1 == *p++)
  35.                 return p1+1;
  36.         }
  37.         p1++;
  38.     }
  39.     return NULL;
  40. }
  41. /////////////////////////////////////////////////////////////////////////////
  42. //
  43. extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, 
  44.     HINSTANCE /*hPrevInstance*/, LPTSTR lpCmdLine, int /*nShowCmd*/)
  45. {
  46.     lpCmdLine = GetCommandLine(); //this line necessary for _ATL_MIN_CRT
  47.     HRESULT hRes = CoInitialize(NULL);
  48.     _ASSERTE(SUCCEEDED(hRes));
  49.     hRes = CoInitializeSecurity(NULL, -1, NULL, NULL,
  50.             RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);
  51.     _ASSERTE(SUCCEEDED(hRes));
  52.     _Module.Init(ObjectMap, hInstance);
  53.     _Module.dwThreadID = GetCurrentThreadId();
  54.     TCHAR szTokens[] = _T("-/");
  55.     int nRet = 0;
  56.     BOOL bRun = TRUE;
  57.     LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
  58.     while (lpszToken != NULL)
  59.     {
  60.         if (lstrcmpi(lpszToken, _T("UnregServer"))==0)
  61.         {
  62.             _Module.UpdateRegistryFromResource(IDR_AtlCont, FALSE);
  63.             nRet = _Module.UnregisterServer();
  64.             bRun = FALSE;
  65.             break;
  66.         }
  67.         if (lstrcmpi(lpszToken, _T("RegServer"))==0)
  68.         {
  69.             _Module.UpdateRegistryFromResource(IDR_AtlCont, TRUE);
  70.             nRet = _Module.RegisterServer(TRUE);
  71.             bRun = FALSE;
  72.             break;
  73.         }
  74.         lpszToken = FindOneOf(lpszToken, szTokens);
  75.     }
  76.     if (bRun)
  77.     {
  78.         hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, 
  79.             REGCLS_MULTIPLEUSE);
  80.         _ASSERTE(SUCCEEDED(hRes));
  81.         CComPtr<IAtlCont> pApp;
  82.         CoCreateInstance(CLSID_CAtlCont, NULL, CLSCTX_INPROC_SERVER, IID_IAtlCont, (void**)&pApp);
  83.         if (pApp)
  84.             pApp->Run();
  85.         MSG msg;
  86.         while (GetMessage(&msg, 0, 0, 0))
  87.         {
  88.             TranslateMessage(&msg);
  89.             DispatchMessage(&msg);
  90.         }
  91.         _Module.RevokeClassObjects();
  92.     }
  93.     CoUninitialize();
  94. #ifdef _ATL_MIN_CRT
  95.     ExitProcess(0);
  96. #endif
  97.     return nRet;
  98. }