예제 #1
0
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();
}
예제 #2
0
void MainFrame::OnQuit(wxCloseEvent& event)
{
	DoSettings(false);
	TheApp->Exit();
}