// Service.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "SysLib.h" #include "ascprocess.h" #include "tcpprocess.h" #include "rtuprocess.h" #include "icpdasprocess.h" #include "SnmpProcess.h" #include "NoticeQueue.h" #include "MainPro.h" #include "CheckDog.h" #include "upsparadigmProcess.h" #include "stulzprocess.h" #include "Separate.h" #include "MostDevice.h" #include "stdio.h" #include "tchar.h" #include #include "winsvc.h" #include "ping.h" //定义全局函数变量 void Init(); BOOL IsInstalled(); BOOL Install(); BOOL Uninstall(); void WINAPI ServiceMain(); void WINAPI ServiceStrl(DWORD dwOpcode); BOOL InitIOService(); void UnInitIOService(); SERVICE_STATUS_HANDLE g_hServiceStatus; SERVICE_STATUS g_status; DWORD dwThreadID; HINSTANCE g_hLangDLL; int CALLBACK Sms_NoticeConfig( BOOL bEnableAlarm ) { if( bEnableAlarm==1 ) LOG4C((LOG_NOTICE, "收到恢复所有报警通知短信")); if( bEnableAlarm==0 ) LOG4C((LOG_NOTICE, "收到关闭所有报警通知短信")); g_bAlarmNoticeFlag = bEnableAlarm; return 0; } //#define UNIQE_NAME "isP-CMS IO Service" //定义唯一的,以免冲突 //#define ra_MSG "isP-CMS_IOService_MSG" //const UINT ID_RA_MSG =::RegisterWindowMessage(ra_MSG); //HANDLE m_hMutexInstance; int _tmain(int argc, _TCHAR* argv[]) { Init(); dwThreadID = ::GetCurrentThreadId(); SERVICE_TABLE_ENTRY st[] = { { g_szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain }, { NULL, NULL } }; CSocketHandle::InitLibrary( MAKEWORD(2,2) ); GetSysData(); CHAR strFile[MAX_FILE_LENGTH + 1] = ""; if( stricmp(g_strLanguage, "CHS") == 0 ) { wsprintf(strFile, "%s\\ChineseRes.dll", g_strDirectory); g_hLangDLL = ::LoadLibrary(strFile); } else if( stricmp(g_strLanguage, "CHT") == 0 ) { wsprintf(strFile, "%s\\TaiwanRes.dll", g_strDirectory); g_hLangDLL = ::LoadLibrary(strFile); } else if( stricmp(g_strLanguage, "ENG") == 0 ) { wsprintf(strFile, "%s\\EnglishRes.dll", g_strDirectory); g_hLangDLL = ::LoadLibrary(strFile); } AfxSetResourceHandle(g_hLangDLL); GetResourceString(); if(argc > 1) { if (stricmp((char *)argv[1], "/install") == 0) { Install(); } else if (stricmp((char *)argv[1], "/uninstall") == 0) { Uninstall(); } else { if (!::StartServiceCtrlDispatcher(st)) { LOG4C((LOG_NOTICE, _T("Register Service Main Function Error!"))); } } } else { if (!::StartServiceCtrlDispatcher(st)) { LOG4C((LOG_NOTICE, _T("Register Service Main Function Error!"))); } } return 0; } BOOL InitIOService() { MTVERIFY (g_hRunObject = ::CreateEvent( NULL, /* Security */ TRUE, /* Manual event */ 0, /* Clear on creation */ 0)); CString strFileName; strFileName.Format("%s\\log4crc", g_strDirectory); LogEvent(strFileName); ///设置日志配置文件名 LOG4C_PARAM_CFG_FILE_NAME(strFileName); ///设置日志级别 LOG4C_PARAM_LOG_LEVEL("NOTICE"); ///设置日志文件大小 LOG4C_PARAM_LOG_FILE_SIZE(10240); ///设置生成日志文件个数,达到最大个数将自动覆盖最旧的日志 LOG4C_PARAM_LOG_FILE_NUM(5); ///设置每次记录日志都重新读取日志配置文件 LOG4C_PARAM_REREAD_LOG_CFG_FILE(1); ///带参数日志模块初始化,以上所有设置了的参数都将生效,没有设置的采用缺省值 LOG4C_INIT_WITH_PARAM(); if( ProgramEncrypt(NULL) == 0 ) return FALSE; g_pDevicesManager = new CDevicesManager(); // 初始化软件狗 #if IS_USE_DOG if( InitDog() != 0 ) { if( g_hRunObject != NULL ) { MTVERIFY( CloseHandle( g_hRunObject ) ); g_hRunObject = NULL; } return FALSE; } #endif //LOG4C((LOG_NOTICE, "%s", g_strConnectString)); //连接数据库 //LOG4C((LOG_NOTICE, "Enter OpenDataBase")); CDBConnection::GetInstancePtr()->OpenDataBase(g_strConnectString); //LOG4C((LOG_NOTICE, "Leave OpenDataBase")); //LOG4C((LOG_NOTICE, "Enter DBConnectionCheckThreadStart")); CDBConnection::GetInstancePtr()->DBConnectionCheckThreadStart(); //LOG4C((LOG_NOTICE, "Leave DBConnectionCheckThreadStart")); //LOG4C((LOG_NOTICE, "Enter SetDBType")); CDBInterface::GetInstancePtr()->SetDBType(g_strDBType); //LOG4C((LOG_NOTICE, "Leave SetDBType")); //LOG4C((LOG_NOTICE, "Enter InitUserRoleInfo")); // 分配用户角色 CDBInterface::GetInstancePtr()->InitUserRoleInfo(); //LOG4C((LOG_NOTICE, "Leave InitUserRoleInfo")); //LOG4C((LOG_NOTICE, "Enter InitNotice")); MTVERIFY( g_hDeleteVarSem = CreateEvent(NULL, TRUE, TRUE, "DeleteVarList") ); InitializeCriticalSection( &g_csVarNotice ); InitializeCriticalSection( &g_csSendNotice ); if( g_nSendNotice ) { InitNotice(); } else LOG4C((LOG_NOTICE, "没有启用语言报警")); // 初始化Sms if( g_nSendSms==1 ) { CString strCommPort = CString(g_strSmsComPort); strCommPort = strCommPort.Mid( 3 ); if( 0==InitSms( 0, atoi(strCommPort), g_nSmsRate, g_nSmsDataBit, g_nSmsStopBit, g_nSmsParity, g_nSmsInterval, g_nSmsLanguageTrans, g_nSmsMaxChar, g_nSmsMakeCall ) ) { #if 1 if( pSmsDllSetCallBack ) { LOG4C((LOG_NOTICE, "启用短信回调函数")); pSmsDllSetCallBack( Sms_NoticeConfig ); } #endif } } else if( g_nSendSms==2 ) { LOG4C((LOG_NOTICE, "启用支持短信平台服务")); } else LOG4C((LOG_NOTICE, "没有启用短信报警")); // 初始化Email if( g_nSendEmail ) { InitEmail(g_strEmailSMTPSrv, g_nEmailSMTPPort, g_nEmailIsNeed, g_strEmailUserAcc, g_strEmailUserPwd, g_strEmailFromAddr, g_nEmailTimeOut); } else LOG4C((LOG_NOTICE, "没有启用email报警")); #if 0 // Tcp服务器 g_pTcpServer = new CServerSocket(); CString strPort; strPort.Format("%d", SOCKET_SERVER_PORT); g_pTcpServer->SvrStart(strPort); #else //LOG4C((LOG_NOTICE, "open listen port")); // Tcp服务器 g_pServerSocket[0] = new CServerSocket(); CString strPort; strPort.Format("%d", SOCKET_SERVER_PORT); g_pServerSocket[0]->SvrStart(strPort); #endif InitPing(); // 开始采集I/O设备 StartMain(); LOG4C((LOG_NOTICE, "system startup success!")); while(g_status.dwCurrentState != SERVICE_STOP_PENDING) { Sleep(1000); } LOG4C((LOG_NOTICE, _T("Service stopped"))); UnInitIOService(); return TRUE; } void UnInitIOService() { MTVERIFY( SetEvent( g_hDeleteVarSem ) ); DeleteCriticalSection( &g_csVarNotice ); DeleteCriticalSection( &g_csSendNotice ); if( g_hDeleteVarSem ) { MTVERIFY( CloseHandle( g_hDeleteVarSem) ); g_hDeleteVarSem = NULL; } if (g_hRunObject != NULL) MTVERIFY( SetEvent( g_hRunObject ) ); EndMain(); #if 0 if (g_pTcpServer != NULL) { g_pTcpServer->SocketStop(); delete g_pTcpServer; g_pTcpServer = NULL; } #else for( int i = 0; i < MAX_SERVER_LISTEN; i++ ) { if( NULL != g_pServerSocket[i] ) { g_pServerSocket[i]->SocketStop(); delete g_pServerSocket[i]; g_pServerSocket[i] = NULL; } } #endif UnInitRtuDll(); UnInitTcpDll(); UnInitAscDll(); UnInitIcpdasDll(); UnInitSnmpDll(); UnInitParadigmDll(); UnInitStulzDll(); UnInitSeparateDll(); UnInitNotice(); if( g_nSendEmail ) { UnInitEmail(); } if( g_nSendSms==1 ) { UnInitSms(); } //回收用户角色 CDBInterface::GetInstancePtr()->UnInitUserRoleInfo(); CDBConnection::GetInstancePtr()->DBConnectionCheckThreadStop(); // 释放软件狗 #if IS_USE_DOG UnInitDog(); #endif if( g_pDevicesManager ) { delete g_pDevicesManager; g_pDevicesManager = NULL; } if( g_hRunObject != NULL ) { MTVERIFY( CloseHandle( g_hRunObject ) ); } if(g_hLangDLL) { AfxFreeLibrary(g_hLangDLL); } UnInitPing(); ///关闭日志模块防止内存/资源泄漏 LOG4C_FINI(); } //********************************************************* //Functiopn: Init //Description: 初始化 //Calls: main //Called By: //Table Accessed: //Table Updated: //Input: //Output: //Return: //Others: //History: // niying