Service.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765
  1. // Service.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include "SysLib.h"
  5. #include "ascprocess.h"
  6. #include "tcpprocess.h"
  7. #include "rtuprocess.h"
  8. #include "icpdasprocess.h"
  9. #include "SnmpProcess.h"
  10. #include "NoticeQueue.h"
  11. #include "MainPro.h"
  12. #include "CheckDog.h"
  13. #include "upsparadigmProcess.h"
  14. #include "stulzprocess.h"
  15. #include "Separate.h"
  16. #include "MostDevice.h"
  17. #include "stdio.h"
  18. #include "tchar.h"
  19. #include <windows.h>
  20. #include "winsvc.h"
  21. #include "ping.h"
  22. #include "SoftRegister.h"
  23. #include "resource1.h"
  24. //定义全局函数变量
  25. void Init();
  26. BOOL IsInstalled();
  27. BOOL Install();
  28. BOOL Uninstall();
  29. void WINAPI ServiceMain();
  30. void WINAPI ServiceStrl(DWORD dwOpcode);
  31. BOOL InitIOService();
  32. void UnInitIOService();
  33. SERVICE_STATUS_HANDLE g_hServiceStatus;
  34. SERVICE_STATUS g_status;
  35. DWORD dwThreadID;
  36. HINSTANCE g_hLangDLL;
  37. int CALLBACK Sms_Receive( int iType,float fData,CString sContent )
  38. {
  39. if( iType==0 )
  40. {
  41. int nRet = (int)fData;
  42. if( nRet==1 )
  43. {
  44. LOG4C((LOG_NOTICE, "收到恢复所有报警通知短信"));
  45. }
  46. else if( (int)fData==0 )
  47. {
  48. LOG4C((LOG_NOTICE, "收到关闭所有报警通知短信"));
  49. }
  50. g_bAlarmNoticeFlag = (int)fData;
  51. }
  52. else if( iType==1 )
  53. {
  54. if( !g_bGetBlanceReturn )
  55. {
  56. g_fBlance = fData;
  57. g_bGetBlanceReturn = true;
  58. CString sShow;
  59. if( int(fData)>=g_nBlanceLessToNotice )
  60. {
  61. sShow.Format( "当前帐户余额:%.2f 元\n%s",fData,sContent );
  62. LOG4C((LOG_NOTICE, sShow));
  63. }
  64. else
  65. {
  66. sShow.Format( g_strHintBlance,fData,g_nBlanceLessToNotice );
  67. LOG4C((LOG_NOTICE, sShow));
  68. if( fData>0.5 )
  69. SendSmsNoticeToUser( 0,sShow );
  70. }
  71. }
  72. }
  73. return 0;
  74. }
  75. //HANDLE m_hMutexInstance;
  76. int _tmain(int argc, _TCHAR* argv[])
  77. {
  78. // *****************给控制台程序设置图标******************************//
  79. HWND hwnd = GetForegroundWindow(); // 直接获得前景窗口的句柄
  80. SendMessage(hwnd , WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(NULL,MAKEINTRESOURCE(IDI_MICON)));
  81. // *****************给控制台程序设置图标******************************//
  82. // 初始化服务参数;
  83. Init();
  84. // 获取当前程序主线程ID,用于程序自我结束时,需调用主线程ID;
  85. dwThreadID = ::GetCurrentThreadId();
  86. // 初始化SOCKET库;
  87. CSocketHandle::InitLibrary( MAKEWORD(2,2) );
  88. // 获取配置文件信息;
  89. GetSysData();
  90. // 加载多语言资源文件 ;
  91. CHAR strFile[MAX_FILE_LENGTH + 1] = "";
  92. if( stricmp(g_strLanguage, "CHS") == 0 )
  93. {
  94. wsprintf(strFile, "%s\\ChineseRes.dll", g_strDirectory);
  95. g_hLangDLL = ::LoadLibrary(strFile);
  96. }
  97. else if( stricmp(g_strLanguage, "CHT") == 0 )
  98. {
  99. wsprintf(strFile, "%s\\TaiwanRes.dll", g_strDirectory);
  100. g_hLangDLL = ::LoadLibrary(strFile);
  101. }
  102. else if( stricmp(g_strLanguage, "ENG") == 0 )
  103. {
  104. wsprintf(strFile, "%s\\EnglishRes.dll", g_strDirectory);
  105. g_hLangDLL = ::LoadLibrary(strFile);
  106. }
  107. // 设置当前程序要用的资源模块 ;
  108. AfxSetResourceHandle(g_hLangDLL);
  109. // 获取当前资源模块的字符串信息;(就是g_hLangDLL模块里的);
  110. GetResourceString();
  111. #ifdef _DEBUG
  112. InitIOService();
  113. HANDLE he = CreateEvent(NULL, TRUE, FALSE, NULL);
  114. WaitForSingleObject(he,INFINITE);
  115. #endif
  116. // 判断服务是否存在;
  117. if( IsInstalled())
  118. {
  119. // 卸载服务;
  120. if ( argc > 1)
  121. {
  122. if (stricmp((char *)argv[1], "/uninstall") == 0)
  123. Uninstall();
  124. // 卸载完了,必须退出;
  125. return 0;
  126. }
  127. else
  128. {
  129. SERVICE_TABLE_ENTRY st[] =
  130. {
  131. { g_szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
  132. { NULL, NULL }
  133. };
  134. // 当服务存在时,通过双击执行文件也会到这一步;
  135. // 但是StartServiceCtrlDispatcher只能在服务管理器才能执行成功,避免了双击服务也能运行;
  136. if (!::StartServiceCtrlDispatcher(st))
  137. {
  138. LOG4C((LOG_NOTICE, _T("Register Service Main Function Error!")));
  139. return 0;
  140. }
  141. }
  142. }
  143. // 2.如果服务不存在,则安装;
  144. SERVICE_TABLE_ENTRY st[] =
  145. {
  146. { g_szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
  147. { NULL, NULL }
  148. };
  149. Install();
  150. return 0;
  151. }
  152. BOOL InitIOService()
  153. {
  154. // 创建程序运行事件,控制整个程序的生命(运行与结束);
  155. MTVERIFY (g_hRunObject = ::CreateEvent(
  156. NULL, /* Security */
  157. TRUE, /* Manual event */
  158. 0, /* Clear on creation */
  159. 0));
  160. // 文件日志模块;
  161. CString strFileName;
  162. strFileName.Format("%s\\log4crc", g_strDirectory);
  163. LogEvent(strFileName);
  164. ///设置日志配置文件名
  165. LOG4C_PARAM_CFG_FILE_NAME(strFileName);
  166. ///设置日志级别
  167. LOG4C_PARAM_LOG_LEVEL("NOTICE");
  168. ///设置日志文件大小
  169. LOG4C_PARAM_LOG_FILE_SIZE(10240);
  170. ///设置生成日志文件个数,达到最大个数将自动覆盖最旧的日志
  171. LOG4C_PARAM_LOG_FILE_NUM(5);
  172. ///设置每次记录日志都重新读取日志配置文件
  173. LOG4C_PARAM_REREAD_LOG_CFG_FILE(1);
  174. ///带参数日志模块初始化,以上所有设置了的参数都将生效,没有设置的采用缺省值
  175. LOG4C_INIT_WITH_PARAM();
  176. if( ProgramEncrypt(NULL) == 0 ) return FALSE;
  177. // 创建设备管理对象(该类不纯,含有通信功能在内,需要修改);
  178. g_pDevicesManager = new CDevicesManager();
  179. // 加密方式;
  180. if( g_nEncryptionType==0 )
  181. {
  182. LOG4C((LOG_NOTICE, "狗加密"));
  183. int nRet=InitDog();
  184. if( nRet != 0 )
  185. {
  186. if( nRet!=-1 )
  187. g_sPassDueInfo = "狗的动态库找不到或者有误!";
  188. g_nUseTimeLimit = 1;
  189. //return FALSE;
  190. }
  191. }
  192. else if( g_nEncryptionType==476 )
  193. {
  194. LOG4C((LOG_NOTICE, "没加密"));
  195. }
  196. else
  197. {
  198. LOG4C((LOG_NOTICE, "软加密"));
  199. int nRet = InitSoftRegister();//0 :OK -1:DLL不存在 1:DLL不是新的
  200. //LOG4C((LOG_NOTICE, "软加密 nRet=%d",nRet));
  201. if( nRet==0 )
  202. {
  203. CString sMsg;
  204. //LOG4C((LOG_NOTICE, "pRegdllJudgeIsRegister in"));
  205. int nRet = pRegdllJudgeIsRegister( sMsg );
  206. //LOG4C((LOG_NOTICE, "pRegdllJudgeIsRegister nRet=%d",nRet));
  207. if( nRet!=0 && nRet!=8 )
  208. {
  209. LOG4C((LOG_NOTICE, "%s 软件不会采集数据!",sMsg ));//LOG4C((LOG_NOTICE, "%s 软件非法退出!",sMsg ));
  210. //试用已经过期( 总试用天数为%s天(%s)
  211. //int n1=-1,n2=-1;
  212. //n1 = sMsg.Find( "天(" );
  213. //n2 = sMsg.Find( ")",n1 );
  214. //g_nSlaveVersion = atoi( sMsg.Mid( n1+3,n2-n1-1 ) );
  215. g_sPassDueInfo = sMsg;
  216. g_nUseTimeLimit = 1;
  217. //return FALSE;
  218. }
  219. else
  220. {
  221. if( nRet==8 )
  222. g_bSoftRegisterFileIsOfficial = true;
  223. g_sPassDueInfo = sMsg;
  224. LOG4C((LOG_NOTICE, "%s",sMsg ));
  225. }
  226. }
  227. else if( nRet==-1 )
  228. {
  229. LOG4C((LOG_NOTICE, "动态库文件Register.dll不存在,软件非法退出!" ));
  230. return FALSE;
  231. }
  232. else //if( nRet==1 )
  233. {
  234. LOG4C((LOG_NOTICE, "动态库文件Register.dll不是新的,软件非法退出!" ));
  235. return FALSE;
  236. }
  237. }
  238. //LOG4C((LOG_NOTICE, "%s", g_strConnectString));
  239. //连接数据库
  240. LOG4C((LOG_NOTICE, "Enter OpenDataBase 【%s】",g_strConnectString));
  241. bool bFlag = false;
  242. while( !bFlag )
  243. {
  244. bFlag = CDBConnection::GetInstancePtr()->OpenDataBase(g_strConnectString);
  245. if( !bFlag )
  246. Sleep( 2000 );
  247. }
  248. //LOG4C((LOG_NOTICE, "Leave OpenDataBase"));
  249. //LOG4C((LOG_NOTICE, "Enter DBConnectionCheckThreadStart"));
  250. CDBConnection::GetInstancePtr()->DBConnectionCheckThreadStart();
  251. //LOG4C((LOG_NOTICE, "Leave DBConnectionCheckThreadStart"));
  252. //LOG4C((LOG_NOTICE, "Enter SetDBType"));
  253. CDBInterface::GetInstancePtr()->SetDBType(g_strDBType);
  254. //LOG4C((LOG_NOTICE, "Leave SetDBType"));
  255. //LOG4C((LOG_NOTICE, "Enter InitUserRoleInfo"));
  256. // 分配用户角色
  257. CDBInterface::GetInstancePtr()->InitUserRoleInfo();
  258. //LOG4C((LOG_NOTICE, "Leave InitUserRoleInfo"));
  259. LOG4C((LOG_NOTICE, "【ver:%s】",g_strVersion));
  260. //LOG4C((LOG_NOTICE, "Enter InitNotice"));
  261. if( !g_bSendVoice )
  262. {
  263. LOG4C((LOG_NOTICE, "没有启用语言通知"));
  264. }
  265. // 初始化报警通知;
  266. int nRet = InitNotice();
  267. if( nRet==1 )
  268. {
  269. LOG4C((LOG_NOTICE, "启用了语音通知,但软件检查到语音卡不存在,请禁用语音通知或者安装语音卡,谢谢!"));
  270. }
  271. else if( nRet==2 )
  272. {
  273. LOG4C((LOG_NOTICE, "动态库不存在,请检查!"));
  274. }
  275. // 初始化Sms;
  276. if( g_nSendSms==1 )
  277. {
  278. CString strCommPort = CString(g_strSmsComPort);
  279. strCommPort = strCommPort.Mid( 3 );
  280. if( 0==InitSms( 0, atoi(strCommPort), g_nSmsRate, g_nSmsDataBit,
  281. g_nSmsStopBit, g_nSmsParity, g_nSmsInterval, g_nSmsLanguageTrans, g_nSmsMaxChar, g_nSmsMakeCall ) )
  282. {
  283. #if 1
  284. if( pSmsDllSetCallBack )
  285. {
  286. //LOG4C((LOG_NOTICE, "启用短信回调函数"));
  287. pSmsDllSetCallBack( Sms_Receive );
  288. }
  289. #endif
  290. }
  291. }
  292. else if( g_nSendSms==2 )
  293. {
  294. LOG4C((LOG_NOTICE, "启用支持短信平台服务"));
  295. }
  296. else
  297. {
  298. LOG4C((LOG_NOTICE, "没有启用短信通知"));
  299. }
  300. // 初始化Email;
  301. if( g_nSendEmail )
  302. {
  303. InitEmail(g_strEmailSMTPSrv, g_nEmailSMTPPort, g_nEmailIsNeed, g_strEmailUserAcc, g_strEmailUserPwd,
  304. g_strEmailFromAddr, g_nEmailTimeOut);
  305. }
  306. else
  307. {
  308. LOG4C((LOG_NOTICE, "没有启用email通知"));
  309. }
  310. #if 0
  311. // Tcp服务器
  312. g_pTcpServer = new CServerSocket();
  313. CString strPort;
  314. strPort.Format("%d", SOCKET_SERVER_PORT);
  315. g_pTcpServer->SvrStart(strPort);
  316. #else
  317. // Tcp服务器
  318. CString strPort1,strPort2,strPort3;
  319. // 被动
  320. g_pServerSocket[0] = new CServerSocket();
  321. strPort1.Format("%d", SOCKET_SERVER_PORT + 0);
  322. g_pServerSocket[0]->SvrStart(strPort1);
  323. // 主动
  324. g_pServerSocket[1] = new CServerSocket();
  325. strPort2.Format("%d", SOCKET_SERVER_PORT + 1);
  326. g_pServerSocket[1]->SvrStart(strPort2);
  327. ////远程DB
  328. //g_pServerSocket[6] = new CServerSocket();
  329. //strPort3.Format("%d", SOCKET_SERVER_PORT + 6);
  330. //g_pServerSocket[6]->SvrStart(strPort3);
  331. LOG4C((LOG_NOTICE, "Create Port %s,%s,%s success", strPort1,strPort2,strPort3));
  332. #endif
  333. // 初始化ping功能;
  334. InitPing();
  335. //读取iniList文件的内容
  336. CString sPath,sTemp;
  337. sPath.Format( "%s\\config", g_strDirectory);
  338. g_FunReadAllIniName( sPath,"*.*",0 );
  339. // 开始采集I/O设备
  340. StartMain();
  341. LOG4C((LOG_NOTICE, "system startup success!"));
  342. while(g_status.dwCurrentState != SERVICE_STOP_PENDING)
  343. {
  344. Sleep(1000);
  345. }
  346. LOG4C((LOG_NOTICE, _T("Service stopped")));
  347. UnInitIOService();
  348. return TRUE;
  349. }
  350. void UnInitIOService()
  351. {
  352. if (g_hRunObject != NULL)
  353. MTVERIFY( SetEvent( g_hRunObject ) );
  354. EndMain();
  355. #if 0
  356. if (g_pTcpServer != NULL)
  357. {
  358. g_pTcpServer->SocketStop();
  359. delete g_pTcpServer;
  360. g_pTcpServer = NULL;
  361. }
  362. #else
  363. for( int i = 0; i < MAX_SERVER_LISTEN; i++ )
  364. {
  365. if( NULL != g_pServerSocket[i] )
  366. {
  367. g_pServerSocket[i]->SocketStop();
  368. delete g_pServerSocket[i];
  369. g_pServerSocket[i] = NULL;
  370. }
  371. }
  372. #endif
  373. UnInitRtuDll();
  374. UnInitTcpDll();
  375. UnInitAscDll();
  376. UnInitIcpdasDll();
  377. UnInitSnmpDll();
  378. UnInitParadigmDll();
  379. UnInitStulzDll();
  380. UnInitSeparateDll();
  381. UnInitNotice();
  382. if( g_nSendEmail )
  383. {
  384. UnInitEmail();
  385. }
  386. if( g_nSendSms==1 )
  387. {
  388. UnInitSms();
  389. }
  390. //回收用户角色
  391. CDBInterface::GetInstancePtr()->UnInitUserRoleInfo();
  392. CDBConnection::GetInstancePtr()->DBConnectionCheckThreadStop();
  393. // 释放软件狗
  394. if( g_nEncryptionType==0 )
  395. UnInitDog();
  396. else if( g_nEncryptionType==476 )
  397. {
  398. }
  399. else
  400. UnInitSoftRegister();
  401. if( g_pDevicesManager )
  402. {
  403. delete g_pDevicesManager;
  404. g_pDevicesManager = NULL;
  405. }
  406. if( g_hRunObject != NULL )
  407. {
  408. MTVERIFY( CloseHandle( g_hRunObject ) );
  409. }
  410. if(g_hLangDLL)
  411. {
  412. AfxFreeLibrary(g_hLangDLL);
  413. }
  414. UnInitPing();
  415. ///关闭日志模块防止内存/资源泄漏
  416. LOG4C_FINI();
  417. }
  418. //*********************************************************
  419. //Functiopn: Init
  420. //Description: 初始化
  421. //Calls: main
  422. //Called By:
  423. //Table Accessed:
  424. //Table Updated:
  425. //Input:
  426. //Output:
  427. //Return:
  428. //Others:
  429. //History:
  430. // <author>niying <time>2006-8-10 <version> <desc>
  431. //*********************************************************
  432. void Init()
  433. {
  434. g_hServiceStatus = NULL;
  435. g_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
  436. g_status.dwCurrentState = SERVICE_STOPPED;
  437. g_status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
  438. g_status.dwWin32ExitCode = 0;
  439. g_status.dwServiceSpecificExitCode = 0;
  440. g_status.dwCheckPoint = 0;
  441. g_status.dwWaitHint = 0;
  442. }
  443. //*********************************************************
  444. //Functiopn: ServiceMain
  445. //Description: 服务主函数,这在里进行控制对服务控制的注册
  446. //Calls:
  447. //Called By:
  448. //Table Accessed:
  449. //Table Updated:
  450. //Input:
  451. //Output:
  452. //Return:
  453. //Others:
  454. //History:
  455. // <author>niying <time>2006-8-10 <version> <desc>
  456. //*********************************************************
  457. void WINAPI ServiceMain()
  458. {
  459. // Register the control request handler
  460. g_status.dwCurrentState = SERVICE_START_PENDING;
  461. g_status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
  462. //注册服务控制
  463. g_hServiceStatus = RegisterServiceCtrlHandler(g_szServiceName, ServiceStrl);
  464. if (g_hServiceStatus == NULL)
  465. {
  466. return;
  467. }
  468. SetServiceStatus(g_hServiceStatus, &g_status);
  469. g_status.dwWin32ExitCode = S_OK;
  470. g_status.dwCheckPoint = 0;
  471. g_status.dwWaitHint = 0;
  472. g_status.dwCurrentState = SERVICE_RUNNING;
  473. SetServiceStatus(g_hServiceStatus, &g_status);
  474. //延时10S,开机自启动时,等待串口服务器和数据库都启动完再开始服务
  475. #if 0
  476. int i = 0;
  477. while (i < 11)
  478. {
  479. Sleep(1000);
  480. i++;
  481. }
  482. //
  483. #endif
  484. Sleep(15000);
  485. InitIOService();
  486. g_status.dwCurrentState = SERVICE_STOPPED;
  487. SetServiceStatus(g_hServiceStatus, &g_status);
  488. }
  489. //*********************************************************
  490. //Functiopn: ServiceStrl
  491. //Description: 服务控制主函数,这里实现对服务的控制,
  492. // 当在服务管理器上停止或其它操作时,将会运行此处代码
  493. //Calls:
  494. //Called By:
  495. //Table Accessed:
  496. //Table Updated:
  497. //Input: dwOpcode:控制服务的状态
  498. //Output:
  499. //Return:
  500. //Others:
  501. //History:
  502. // <author>niying <time>2006-8-10 <version> <desc>
  503. //*********************************************************
  504. void WINAPI ServiceStrl(DWORD dwOpcode)
  505. {
  506. switch (dwOpcode)
  507. {
  508. case SERVICE_CONTROL_STOP:
  509. //UnInitIOService();
  510. g_status.dwCurrentState = SERVICE_STOP_PENDING;
  511. SetServiceStatus(g_hServiceStatus, &g_status);
  512. PostThreadMessage(dwThreadID, WM_CLOSE, 0, 0);
  513. break;
  514. case SERVICE_CONTROL_PAUSE:
  515. break;
  516. case SERVICE_CONTROL_CONTINUE:
  517. break;
  518. case SERVICE_CONTROL_INTERROGATE:
  519. break;
  520. case SERVICE_CONTROL_SHUTDOWN:
  521. UnInitIOService();
  522. break;
  523. default:
  524. LOG4C((LOG_NOTICE, _T("Bad service request")));
  525. }
  526. }
  527. //*********************************************************
  528. //Functiopn: IsInstalled
  529. //Description: 判断服务是否已经被安装
  530. //Calls:
  531. //Called By:
  532. //Table Accessed:
  533. //Table Updated:
  534. //Input:
  535. //Output:
  536. //Return:
  537. //Others:
  538. //History:
  539. // <author>niying <time>2006-8-10 <version> <desc>
  540. //*********************************************************
  541. BOOL IsInstalled()
  542. {
  543. BOOL bResult = FALSE;
  544. //打开服务控制管理器
  545. SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  546. if (hSCM != NULL)
  547. {
  548. //打开服务
  549. SC_HANDLE hService = ::OpenService(hSCM, g_szServiceName, SERVICE_QUERY_CONFIG);
  550. if (hService != NULL)
  551. {
  552. bResult = TRUE;
  553. ::CloseServiceHandle(hService);
  554. }
  555. ::CloseServiceHandle(hSCM);
  556. }
  557. return bResult;
  558. }
  559. //*********************************************************
  560. //Functiopn: Install
  561. //Description: 安装服务函数
  562. //Calls:
  563. //Called By:
  564. //Table Accessed:
  565. //Table Updated:
  566. //Input:
  567. //Output:
  568. //Return:
  569. //Others:
  570. //History:
  571. // <author>niying <time>2006-8-10 <version> <desc>
  572. //*********************************************************
  573. BOOL Install()
  574. {
  575. if (IsInstalled())
  576. return TRUE;
  577. //打开服务控制管理器
  578. SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  579. if (hSCM == NULL)
  580. {
  581. //MessageBox(NULL, _T("Couldn't open service manager"), g_szServiceName, MB_OK);
  582. LOG4C((LOG_NOTICE,"安装服务: 未能打开服务管理器,安装失败"));
  583. int iEr = GetLastError();
  584. return FALSE;
  585. }
  586. // Get the executable file path
  587. TCHAR szFilePath[MAX_PATH];
  588. ::GetModuleFileName(NULL, szFilePath, MAX_PATH);
  589. //创建服务
  590. SC_HANDLE hService = ::CreateService(
  591. hSCM,
  592. g_szServiceName,
  593. g_szServiceName,
  594. SERVICE_ALL_ACCESS,
  595. SERVICE_WIN32_OWN_PROCESS,
  596. SERVICE_DEMAND_START, //SERVICE_AUTO_START,
  597. SERVICE_ERROR_NORMAL,
  598. szFilePath,
  599. NULL,
  600. NULL,
  601. _T(""),
  602. NULL,
  603. NULL);
  604. SERVICE_DESCRIPTION ServiceDesc;
  605. static TCHAR szDescription[MAX_PATH];
  606. _tcscpy(szDescription, g_strServiceName);
  607. ServiceDesc.lpDescription = szDescription;
  608. ::ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, &ServiceDesc);
  609. if (hService == NULL)
  610. {
  611. ::CloseServiceHandle(hSCM);
  612. //MessageBox(NULL, _T("Couldn't create service"), g_szServiceName, MB_OK);
  613. LOG4C((LOG_NOTICE,"安装服务: 未能打开服务,安装失败"));
  614. return FALSE;
  615. }
  616. ::CloseServiceHandle(hService);
  617. ::CloseServiceHandle(hSCM);
  618. LOG4C((LOG_NOTICE,"安装服务: 安装服务成功"));
  619. return TRUE;
  620. }
  621. //*********************************************************
  622. //Functiopn: Uninstall
  623. //Description: 删除服务函数
  624. //Calls:
  625. //Called By:
  626. //Table Accessed:
  627. //Table Updated:
  628. //Input:
  629. //Output:
  630. //Return:
  631. //Others:
  632. //History:
  633. // <author>niying <time>2006-8-10 <version> <desc>
  634. //*********************************************************
  635. BOOL Uninstall()
  636. {
  637. if (!IsInstalled())
  638. return TRUE;
  639. SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  640. if (hSCM == NULL)
  641. {
  642. //MessageBox(NULL, _T("Couldn't open service manager"), g_szServiceName, MB_OK);
  643. LOG4C((LOG_NOTICE,"卸载服务: 未能打开服务管理器"));
  644. return FALSE;
  645. }
  646. SC_HANDLE hService = ::OpenService(hSCM, g_szServiceName, SERVICE_STOP | DELETE);
  647. if (hService == NULL)
  648. {
  649. ::CloseServiceHandle(hSCM);
  650. //MessageBox(NULL, _T("Couldn't open service"), g_szServiceName, MB_OK);
  651. LOG4C((LOG_NOTICE,"卸载服务: 未能打开服务"));
  652. return FALSE;
  653. }
  654. SERVICE_STATUS g_status;
  655. ::ControlService(hService, SERVICE_CONTROL_STOP, &g_status);
  656. //删除服务
  657. BOOL bDelete = ::DeleteService(hService);
  658. ::CloseServiceHandle(hService);
  659. ::CloseServiceHandle(hSCM);
  660. if (bDelete)
  661. return TRUE;
  662. LOG4C((LOG_NOTICE, _T("卸载服务:卸载服务失败")));
  663. return FALSE;
  664. }