void CServiceModule::Run() { _Module.dwThreadID = GetCurrentThreadId(); _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); CEgTcpDriver::Init(); if(!CEgLibTraceManager::g_spTrace) { CEgTpTracePtr spTrace = CEgTpTracePtr(new CEgTpTrace()); if(spTrace) { spTrace->ReadTraceSettings(); CEgLibTraceManager::g_spTrace = boost::shared_static_cast<CEgLibTraceManager>(spTrace); } } // If you are running on NT 4.0 or higher you can use the following call // instead to make the EXE free threaded. // This means that calls come in on a random RPC thread // HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); HRESULT hRes; if(m_bService) { // This provides a NULL DACL which will allow access to everyone. CSecurityDescriptor sd; hRes = sd.InitializeFromThreadToken(); if(FAILED(hRes)) { Trace(1,_T("Transport Service Run"),_T("InitializeFromThreadToken error %X"),hRes); } hRes = CoInitializeSecurity(sd, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); if(FAILED(hRes)) { Trace(1,_T("Transport Service Run"),_T("CoInitializeSecurity error %X"),hRes); } _ASSERTE(SUCCEEDED(hRes)); hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, REGCLS_MULTIPLEUSE | REGCLS_SUSPENDED); if(FAILED(hRes)) { Trace(1,_T("Transport Service Run"),_T("RegisterClassObjects error %X"),hRes); } _ASSERTE(SUCCEEDED(hRes)); hRes = CoResumeClassObjects(); if(FAILED(hRes)) { Trace(1,_T("Transport Service Run"),_T("CoResumeClassObjects error %X"),hRes); } } else { #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); _ASSERTE(SUCCEEDED(hRes)); #endif } DoSettings(); //EgAssert(g_pHost); //EgAssert(g_pRouter); if (m_bService) SetServiceStatus(SERVICE_RUNNING); CEgLibTraceManager::Trace(LogError,_T("Transport Service Run"),_T("Transport Service started")); m_isRunning = TRUE; MSG msg; while (GetMessage(&msg, 0, 0, 0)) DispatchMessage(&msg); m_isRunning = FALSE; _Module.RevokeClassObjects(); CEgLibTraceManager::Trace(LogError,_T("Transport Service Run"),_T("Transport Service stopped")); if(CEgLibTraceManager::g_spTrace!=NULL) CEgLibTraceManager::g_spTrace.reset(); if (m_bService) SetServiceStatus(SERVICE_STOPPED); CEgTcpDriver::Exit(); }
void MainFrame::OnQuit(wxCloseEvent& event) { DoSettings(false); TheApp->Exit(); }