123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765 |
- // 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"
- #include "SoftRegister.h"
- #include "resource1.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_Receive( int iType,float fData,CString sContent )
- {
- if( iType==0 )
- {
- int nRet = (int)fData;
- if( nRet==1 )
- {
- LOG4C((LOG_NOTICE, "收到恢复所有报警通知短信"));
- }
- else if( (int)fData==0 )
- {
- LOG4C((LOG_NOTICE, "收到关闭所有报警通知短信"));
- }
- g_bAlarmNoticeFlag = (int)fData;
- }
- else if( iType==1 )
- {
- if( !g_bGetBlanceReturn )
- {
- g_fBlance = fData;
- g_bGetBlanceReturn = true;
- CString sShow;
- if( int(fData)>=g_nBlanceLessToNotice )
- {
- sShow.Format( "当前帐户余额:%.2f 元\n%s",fData,sContent );
- LOG4C((LOG_NOTICE, sShow));
- }
- else
- {
- sShow.Format( g_strHintBlance,fData,g_nBlanceLessToNotice );
- LOG4C((LOG_NOTICE, sShow));
- if( fData>0.5 )
- SendSmsNoticeToUser( 0,sShow );
- }
- }
- }
- return 0;
- }
- //HANDLE m_hMutexInstance;
- int _tmain(int argc, _TCHAR* argv[])
- {
- // *****************给控制台程序设置图标******************************//
- HWND hwnd = GetForegroundWindow(); // 直接获得前景窗口的句柄
- SendMessage(hwnd , WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(NULL,MAKEINTRESOURCE(IDI_MICON)));
- // *****************给控制台程序设置图标******************************//
- // 初始化服务参数;
- Init();
- // 获取当前程序主线程ID,用于程序自我结束时,需调用主线程ID;
- dwThreadID = ::GetCurrentThreadId();
- // 初始化SOCKET库;
- 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);
- // 获取当前资源模块的字符串信息;(就是g_hLangDLL模块里的);
- GetResourceString();
- #ifdef _DEBUG
- InitIOService();
- HANDLE he = CreateEvent(NULL, TRUE, FALSE, NULL);
- WaitForSingleObject(he,INFINITE);
- #endif
- // 判断服务是否存在;
- if( IsInstalled())
- {
- // 卸载服务;
- if ( argc > 1)
- {
- if (stricmp((char *)argv[1], "/uninstall") == 0)
- Uninstall();
- // 卸载完了,必须退出;
- return 0;
- }
- else
- {
- SERVICE_TABLE_ENTRY st[] =
- {
- { g_szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
- { NULL, NULL }
- };
- // 当服务存在时,通过双击执行文件也会到这一步;
- // 但是StartServiceCtrlDispatcher只能在服务管理器才能执行成功,避免了双击服务也能运行;
- if (!::StartServiceCtrlDispatcher(st))
- {
- LOG4C((LOG_NOTICE, _T("Register Service Main Function Error!")));
- return 0;
- }
- }
- }
- // 2.如果服务不存在,则安装;
- SERVICE_TABLE_ENTRY st[] =
- {
- { g_szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
- { NULL, NULL }
- };
- Install();
- 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( g_nEncryptionType==0 )
- {
- LOG4C((LOG_NOTICE, "狗加密"));
- int nRet=InitDog();
- if( nRet != 0 )
- {
- if( nRet!=-1 )
- g_sPassDueInfo = "狗的动态库找不到或者有误!";
- g_nUseTimeLimit = 1;
- //return FALSE;
- }
- }
- else if( g_nEncryptionType==476 )
- {
- LOG4C((LOG_NOTICE, "没加密"));
- }
- else
- {
- LOG4C((LOG_NOTICE, "软加密"));
- int nRet = InitSoftRegister();//0 :OK -1:DLL不存在 1:DLL不是新的
- //LOG4C((LOG_NOTICE, "软加密 nRet=%d",nRet));
- if( nRet==0 )
- {
- CString sMsg;
- //LOG4C((LOG_NOTICE, "pRegdllJudgeIsRegister in"));
- int nRet = pRegdllJudgeIsRegister( sMsg );
- //LOG4C((LOG_NOTICE, "pRegdllJudgeIsRegister nRet=%d",nRet));
- if( nRet!=0 && nRet!=8 )
- {
- LOG4C((LOG_NOTICE, "%s 软件不会采集数据!",sMsg ));//LOG4C((LOG_NOTICE, "%s 软件非法退出!",sMsg ));
- //试用已经过期( 总试用天数为%s天(%s)
- //int n1=-1,n2=-1;
- //n1 = sMsg.Find( "天(" );
- //n2 = sMsg.Find( ")",n1 );
- //g_nSlaveVersion = atoi( sMsg.Mid( n1+3,n2-n1-1 ) );
- g_sPassDueInfo = sMsg;
- g_nUseTimeLimit = 1;
- //return FALSE;
- }
- else
- {
- if( nRet==8 )
- g_bSoftRegisterFileIsOfficial = true;
- g_sPassDueInfo = sMsg;
- LOG4C((LOG_NOTICE, "%s",sMsg ));
- }
- }
- else if( nRet==-1 )
- {
- LOG4C((LOG_NOTICE, "动态库文件Register.dll不存在,软件非法退出!" ));
- return FALSE;
- }
- else //if( nRet==1 )
- {
- LOG4C((LOG_NOTICE, "动态库文件Register.dll不是新的,软件非法退出!" ));
- return FALSE;
- }
- }
- //LOG4C((LOG_NOTICE, "%s", g_strConnectString));
- //连接数据库
- LOG4C((LOG_NOTICE, "Enter OpenDataBase 【%s】",g_strConnectString));
- bool bFlag = false;
- while( !bFlag )
- {
- bFlag = CDBConnection::GetInstancePtr()->OpenDataBase(g_strConnectString);
- if( !bFlag )
- Sleep( 2000 );
- }
- //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, "【ver:%s】",g_strVersion));
- //LOG4C((LOG_NOTICE, "Enter InitNotice"));
- if( !g_bSendVoice )
- {
- LOG4C((LOG_NOTICE, "没有启用语言通知"));
- }
- // 初始化报警通知;
- int nRet = InitNotice();
- if( nRet==1 )
- {
- LOG4C((LOG_NOTICE, "启用了语音通知,但软件检查到语音卡不存在,请禁用语音通知或者安装语音卡,谢谢!"));
- }
- else if( nRet==2 )
- {
- 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_Receive );
- }
- #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
- // Tcp服务器
- CString strPort1,strPort2,strPort3;
- // 被动
- g_pServerSocket[0] = new CServerSocket();
- strPort1.Format("%d", SOCKET_SERVER_PORT + 0);
- g_pServerSocket[0]->SvrStart(strPort1);
- // 主动
- g_pServerSocket[1] = new CServerSocket();
- strPort2.Format("%d", SOCKET_SERVER_PORT + 1);
- g_pServerSocket[1]->SvrStart(strPort2);
- ////远程DB
- //g_pServerSocket[6] = new CServerSocket();
- //strPort3.Format("%d", SOCKET_SERVER_PORT + 6);
- //g_pServerSocket[6]->SvrStart(strPort3);
- LOG4C((LOG_NOTICE, "Create Port %s,%s,%s success", strPort1,strPort2,strPort3));
- #endif
- // 初始化ping功能;
- InitPing();
- //读取iniList文件的内容
- CString sPath,sTemp;
- sPath.Format( "%s\\config", g_strDirectory);
- g_FunReadAllIniName( sPath,"*.*",0 );
- // 开始采集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()
- {
- 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( g_nEncryptionType==0 )
- UnInitDog();
- else if( g_nEncryptionType==476 )
- {
- }
- else
- UnInitSoftRegister();
- 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
- Sleep(15000);
- 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);
- LOG4C((LOG_NOTICE,"安装服务: 未能打开服务管理器,安装失败"));
- int iEr = GetLastError();
- 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);
- LOG4C((LOG_NOTICE,"安装服务: 未能打开服务,安装失败"));
- return FALSE;
- }
- ::CloseServiceHandle(hService);
- ::CloseServiceHandle(hSCM);
- LOG4C((LOG_NOTICE,"安装服务: 安装服务成功"));
- 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);
- LOG4C((LOG_NOTICE,"卸载服务: 未能打开服务管理器"));
- 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);
- LOG4C((LOG_NOTICE,"卸载服务: 未能打开服务"));
- 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("卸载服务:卸载服务失败")));
- return FALSE;
- }
|