// Shutdown.cpp : Implementation of WinMain // Note: Proxy/Stub Information // To build a separate proxy/stub DLL, // run nmake -f Shutdownps.mk in the project directory. #include "stdafx.h" #include "resource.h" #include #include "Shutdown.h" #include "Shutdown_i.c" #include "../common/Interfaces.cpp" CShutdownApp _Module; CComObjectGlobal g_site; /* BEGIN_OBJECT_MAP(ObjectMap) END_OBJECT_MAP() */ const DWORD dwPause = 1000; // time to wait for threads to finish up LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2) { while (p1 != NULL && *p1 != NULL) { LPCTSTR p = p2; while (p != NULL && *p != NULL) { if (*p1 == *p) return CharNext(p1); p = CharNext(p); } p1 = CharNext(p1); } return NULL; } ///////////////////////////////////////////////////////////////////////////// // extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpCmdLine, int /*nShowCmd*/) { lpCmdLine = GetCommandLine(); //this line necessary for _ATL_MIN_CRT #if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED) HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED); #else HRESULT hRes = CoInitialize(NULL); #endif _ASSERTE(SUCCEEDED(hRes)); _Module.Init(NULL/*ObjectMap*/, hInstance, &LIBID_SHUTDOWNLib); // _Module.dwThreadID = GetCurrentThreadId(); TCHAR szTokens[] = _T("-/"); int nRet = 0; BOOL bRun = TRUE; LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens); while (lpszToken != NULL) { if (lstrcmpi(lpszToken, _T("UnregServer"))==0) { // _Module.UpdateRegistryFromResource(IDR_Shutdown, FALSE); // nRet = _Module.UnregisterServer(TRUE); bRun = FALSE; break; } if (lstrcmpi(lpszToken, _T("RegServer"))==0) { _Module.RegisterDlls(); // _Module.UpdateRegistryFromResource(IDR_Shutdown, TRUE); // nRet = _Module.RegisterServer(TRUE); bRun = FALSE; break; } lpszToken = FindOneOf(lpszToken, szTokens); } if (bRun) { // _Module.StartMonitor(); #if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED) // hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, // REGCLS_MULTIPLEUSE | REGCLS_SUSPENDED); // _ASSERTE(SUCCEEDED(hRes)); // hRes = CoResumeClassObjects(); #else // hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, // REGCLS_MULTIPLEUSE); #endif // _ASSERTE(SUCCEEDED(hRes)); if(_Module.InitInstance()) { MSG msg; while (GetMessage(&msg, 0, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } // _Module.RevokeClassObjects(); // Sleep(dwPause); //wait for any threads to finish } _Module.ExitInstance(); } _Module.Term(); CoUninitialize(); return nRet; }