| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624 |
- // 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 <windows.h>
- #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:
- // <author>niying <time>2006-8-10 <version> <desc>
- //*********************************************************
- void Init()
- {
- g_hServiceStatus = NULL;
- g_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
- g_status.dwCurrentState = SERVICE_STOPPED;
- g_status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
- g_status.dwWin32ExitCode = 0;
- g_status.dwServiceSpecificExitCode = 0;
- g_status.dwCheckPoint = 0;
- g_status.dwWaitHint = 0;
- }
- //*********************************************************
- //Functiopn: ServiceMain
- //Description: 服务主函数,这在里进行控制对服务控制的注册
- //Calls:
- //Called By:
- //Table Accessed:
- //Table Updated:
- //Input:
- //Output:
- //Return:
- //Others:
- //History:
- // <author>niying <time>2006-8-10 <version> <desc>
- //*********************************************************
- void WINAPI ServiceMain()
- {
- // Register the control request handler
- g_status.dwCurrentState = SERVICE_START_PENDING;
- g_status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
- //注册服务控制
- g_hServiceStatus = RegisterServiceCtrlHandler(g_szServiceName, ServiceStrl);
- if (g_hServiceStatus == NULL)
- {
- return;
- }
- SetServiceStatus(g_hServiceStatus, &g_status);
- g_status.dwWin32ExitCode = S_OK;
- g_status.dwCheckPoint = 0;
- g_status.dwWaitHint = 0;
- g_status.dwCurrentState = SERVICE_RUNNING;
- SetServiceStatus(g_hServiceStatus, &g_status);
- //延时10S,开机自启动时,等待串口服务器和数据库都启动完再开始服务
- #if 0
- int i = 0;
- while (i < 11)
- {
- Sleep(1000);
- i++;
- }
- //
- #endif
- InitIOService();
- g_status.dwCurrentState = SERVICE_STOPPED;
- SetServiceStatus(g_hServiceStatus, &g_status);
- }
- //*********************************************************
- //Functiopn: ServiceStrl
- //Description: 服务控制主函数,这里实现对服务的控制,
- // 当在服务管理器上停止或其它操作时,将会运行此处代码
- //Calls:
- //Called By:
- //Table Accessed:
- //Table Updated:
- //Input: dwOpcode:控制服务的状态
- //Output:
- //Return:
- //Others:
- //History:
- // <author>niying <time>2006-8-10 <version> <desc>
- //*********************************************************
- void WINAPI ServiceStrl(DWORD dwOpcode)
- {
- switch (dwOpcode)
- {
- case SERVICE_CONTROL_STOP:
- //UnInitIOService();
- g_status.dwCurrentState = SERVICE_STOP_PENDING;
- SetServiceStatus(g_hServiceStatus, &g_status);
- PostThreadMessage(dwThreadID, WM_CLOSE, 0, 0);
- break;
- case SERVICE_CONTROL_PAUSE:
- break;
- case SERVICE_CONTROL_CONTINUE:
- break;
- case SERVICE_CONTROL_INTERROGATE:
- break;
- case SERVICE_CONTROL_SHUTDOWN:
- UnInitIOService();
- break;
- default:
- LOG4C((LOG_NOTICE, _T("Bad service request")));
- }
- }
- //*********************************************************
- //Functiopn: IsInstalled
- //Description: 判断服务是否已经被安装
- //Calls:
- //Called By:
- //Table Accessed:
- //Table Updated:
- //Input:
- //Output:
- //Return:
- //Others:
- //History:
- // <author>niying <time>2006-8-10 <version> <desc>
- //*********************************************************
- BOOL IsInstalled()
- {
- BOOL bResult = FALSE;
- //打开服务控制管理器
- SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
- if (hSCM != NULL)
- {
- //打开服务
- SC_HANDLE hService = ::OpenService(hSCM, g_szServiceName, SERVICE_QUERY_CONFIG);
- if (hService != NULL)
- {
- bResult = TRUE;
- ::CloseServiceHandle(hService);
- }
- ::CloseServiceHandle(hSCM);
- }
- return bResult;
- }
- //*********************************************************
- //Functiopn: Install
- //Description: 安装服务函数
- //Calls:
- //Called By:
- //Table Accessed:
- //Table Updated:
- //Input:
- //Output:
- //Return:
- //Others:
- //History:
- // <author>niying <time>2006-8-10 <version> <desc>
- //*********************************************************
- BOOL Install()
- {
- if (IsInstalled())
- return TRUE;
- //打开服务控制管理器
- SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
- if (hSCM == NULL)
- {
- //MessageBox(NULL, _T("Couldn't open service manager"), g_szServiceName, MB_OK);
- return FALSE;
- }
- // Get the executable file path
- TCHAR szFilePath[MAX_PATH];
- ::GetModuleFileName(NULL, szFilePath, MAX_PATH);
- //创建服务
- SC_HANDLE hService = ::CreateService(
- hSCM,
- g_szServiceName,
- g_szServiceName,
- SERVICE_ALL_ACCESS,
- SERVICE_WIN32_OWN_PROCESS,
- SERVICE_DEMAND_START, //SERVICE_AUTO_START,
- SERVICE_ERROR_NORMAL,
- szFilePath,
- NULL,
- NULL,
- _T(""),
- NULL,
- NULL);
- SERVICE_DESCRIPTION ServiceDesc;
- static TCHAR szDescription[MAX_PATH];
- _tcscpy(szDescription, g_strServiceName);
- ServiceDesc.lpDescription = szDescription;
- ::ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, &ServiceDesc);
- if (hService == NULL)
- {
- ::CloseServiceHandle(hSCM);
- //MessageBox(NULL, _T("Couldn't create service"), g_szServiceName, MB_OK);
- return FALSE;
- }
- ::CloseServiceHandle(hService);
- ::CloseServiceHandle(hSCM);
- return TRUE;
- }
- //*********************************************************
- //Functiopn: Uninstall
- //Description: 删除服务函数
- //Calls:
- //Called By:
- //Table Accessed:
- //Table Updated:
- //Input:
- //Output:
- //Return:
- //Others:
- //History:
- // <author>niying <time>2006-8-10 <version> <desc>
- //*********************************************************
- BOOL Uninstall()
- {
- if (!IsInstalled())
- return TRUE;
- SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
- if (hSCM == NULL)
- {
- //MessageBox(NULL, _T("Couldn't open service manager"), g_szServiceName, MB_OK);
- return FALSE;
- }
- SC_HANDLE hService = ::OpenService(hSCM, g_szServiceName, SERVICE_STOP | DELETE);
- if (hService == NULL)
- {
- ::CloseServiceHandle(hSCM);
- //MessageBox(NULL, _T("Couldn't open service"), g_szServiceName, MB_OK);
- return FALSE;
- }
- SERVICE_STATUS g_status;
- ::ControlService(hService, SERVICE_CONTROL_STOP, &g_status);
- //删除服务
- BOOL bDelete = ::DeleteService(hService);
- ::CloseServiceHandle(hService);
- ::CloseServiceHandle(hSCM);
- if (bDelete)
- return TRUE;
- LOG4C((LOG_NOTICE, _T("Service could not be deleted")));
- return FALSE;
- }
|