@@ -14,22 +14,28 @@ bool bIsRun = false;
1414XHANDLE xhLog = NULL ;
1515XENGINE_SERVICECONFIG st_ServiceConfig = {};
1616// 服务名称,使用 constexpr 替代宏定义
17- constexpr LPCWSTR SERVICE_NAME = L" XEngine_APIService" ;
17+ constexpr LPCTSTR XENGINE_SERVICE_NAME = _T(" XEngine_APIService" );
18+ constexpr LPCTSTR XENGINE_SERVICE_SHOW = _T(" XEngine APIService 管理服务" );
19+ constexpr LPCTSTR XENGINE_SERVICE_DESCRIPTION = _T(" XEngine APIService 数据查询与系统管理接口服务程序" );
1820// 全局变量
1921SERVICE_STATUS st_ServiceStatus = { 0 };
20- SERVICE_STATUS_HANDLE st_hServiceStatusHandle = nullptr ;
22+ SERVICE_STATUS_HANDLE hServiceStatusHandle = NULL ;
2123// 函数声明
2224void WINAPI XEngine_ServiceCtrlHandler (DWORD dwControl);
2325void WINAPI XEngine_ServiceMain (DWORD dwArgc, LPTSTR* lpszArgv);
2426void XEngine_InstallService ();
2527void XEngine_UninstallService ();
26- // 主函数
27- int wmain ( int argc, wchar_t * argv[] )
28+
29+ bool XEngine_InitLog ( )
2830{
31+ if (NULL != xhLog)
32+ {
33+ return true ;
34+ }
2935 // 初始化参数
30- if (!XEngine_Configure_Parament (argc, argv ))
36+ if (!XEngine_Configure_Parament ())
3137 {
32- return - 1 ;
38+ return false ;
3339 }
3440 // 初始日志
3541 HELPCOMPONENTS_XLOG_CONFIGURE st_XLogConfig = {};
@@ -40,33 +46,37 @@ int wmain(int argc, wchar_t* argv[])
4046 if (NULL == xhLog)
4147 {
4248 printf (" 启动服务中,启动日志失败,错误:%lX" , XLog_GetLastError ());
43- return - 2 ;
49+ return false ;
4450 }
4551 // 设置日志打印级别
4652 HelpComponents_XLog_SetLogPriority (xhLog, st_ServiceConfig.st_XLog .nLogType );
4753 XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 启动服务中,初始化日志系统成功" ));
48-
54+ return true ;
55+ }
56+ // 主函数
57+ int _tmain (int argc, TCHAR* argv[])
58+ {
59+ XEngine_InitLog ();
4960 if (argc > 1 )
5061 {
51- if (_wcsicmp (argv[1 ], L" install" ) == 0 )
62+ if (0 == _tcsicmp (argv[1 ], L" - install" ))
5263 {
5364 XEngine_InstallService ();
5465 return 0 ;
5566 }
56- else if (_wcsicmp (argv[1 ], L" uninstall" ) == 0 )
67+ else if (0 == _tcsicmp (argv[1 ], L" - uninstall" ))
5768 {
5869 XEngine_UninstallService ();
5970 return 0 ;
6071 }
6172 }
62-
63- SERVICE_TABLE_ENTRYW ServiceTable[] =
73+
74+ SERVICE_TABLE_ENTRY ServiceTable[] =
6475 {
65- { const_cast <LPWSTR>(SERVICE_NAME ), (LPSERVICE_MAIN_FUNCTIONW )XEngine_ServiceMain },
66- { nullptr , nullptr }
76+ { const_cast <LPTSTR>(XENGINE_SERVICE_NAME ), (LPSERVICE_MAIN_FUNCTION )XEngine_ServiceMain },
77+ { NULL , NULL }
6778 };
68-
69- if (!StartServiceCtrlDispatcherW (ServiceTable))
79+ if (!StartServiceCtrlDispatcher (ServiceTable))
7080 {
7181 XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,启动服务控制程序失败,错误:%d" ), GetLastError ());
7282 return -3 ;
@@ -77,122 +87,142 @@ int wmain(int argc, wchar_t* argv[])
7787// 服务主函数
7888void WINAPI XEngine_ServiceMain (DWORD dwArgc, LPTSTR* lpszArgv)
7989{
90+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 启动服务中,开始处理服务程序" ));
8091 // 初始化服务状态
8192 st_ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
8293 st_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
8394 st_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
8495 st_ServiceStatus.dwWin32ExitCode = 0 ;
8596 st_ServiceStatus.dwServiceSpecificExitCode = 0 ;
8697 st_ServiceStatus.dwCheckPoint = 0 ;
87- st_ServiceStatus.dwWaitHint = 0 ;
88-
98+ st_ServiceStatus.dwWaitHint = 1000 ;
8999 // 注册服务控制处理程序
90- st_hServiceStatusHandle = RegisterServiceCtrlHandlerW (SERVICE_NAME , XEngine_ServiceCtrlHandler);
91- if (NULL == st_hServiceStatusHandle )
100+ hServiceStatusHandle = RegisterServiceCtrlHandlerW (XENGINE_SERVICE_NAME , XEngine_ServiceCtrlHandler);
101+ if (NULL == hServiceStatusHandle )
92102 {
93- XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,启动服务控制程序失败 ,错误:%d" ), GetLastError ());
103+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,注册服务控制程序失败 ,错误:%d" ), GetLastError ());
94104 return ;
95105 }
96-
106+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X ( " 启动服务中,注册服务控制程序成功 " ));
97107 // 服务启动完成
98- st_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
99- if (!SetServiceStatus (st_hServiceStatusHandle, &st_ServiceStatus))
108+ if (!SetServiceStatus (hServiceStatusHandle, &st_ServiceStatus))
100109 {
101- throw std::runtime_error (" SetServiceStatus failed" );
102- }
103-
104- // 服务主循环(示例)
105- while (st_ServiceStatus.dwCurrentState == SERVICE_RUNNING)
106- {
107- Sleep (1000 ); // 模拟服务工作
108- // 在这里添加你的服务逻辑
110+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,启动服务设置状态失败,错误:%d" ), GetLastError ());
111+ return ;
109112 }
110- try
113+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 启动服务中,设置服务程序状态成功" ));
114+ // 服务启动完成
115+ st_ServiceStatus.dwCheckPoint = 0 ;
116+ st_ServiceStatus.dwWaitHint = 0 ;
117+ st_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
118+ st_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
119+ if (!SetServiceStatus (hServiceStatusHandle, &st_ServiceStatus))
111120 {
112-
121+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,启动服务启动状态失败,错误:%d" ), GetLastError ());
122+ return ;
113123 }
114- catch (const std::exception& e)
124+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 启动服务中,设置服务启动状态成功,服务运行中" ));
125+ bIsRun = true ;
126+ while (bIsRun)
115127 {
116- std::wcerr << L" ServiceMain exception: " << e.what () << L" \n " ;
117- st_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
118- SetServiceStatus (st_hServiceStatusHandle, &st_ServiceStatus);
128+ Sleep (1000 );
119129 }
120130}
121-
122131// 服务控制处理函数
123132void WINAPI XEngine_ServiceCtrlHandler (DWORD dwControl)
124133{
125134 switch (dwControl)
126135 {
136+ case SERVICE_CONTROL_PAUSE:
137+ break ;
138+ case SERVICE_CONTROL_CONTINUE:
139+ st_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
140+ SetServiceStatus (hServiceStatusHandle, &st_ServiceStatus);
141+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 服务运行中,收到命令,继续执行" ));
142+ break ;
127143 case SERVICE_CONTROL_STOP:
144+ bIsRun = false ;
145+ st_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
146+ SetServiceStatus (hServiceStatusHandle, &st_ServiceStatus);
147+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 服务运行中,收到命令,停止运行" ));
148+ break ;
128149 case SERVICE_CONTROL_SHUTDOWN:
150+ bIsRun = false ;
129151 st_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
130- SetServiceStatus (st_hServiceStatusHandle, &st_ServiceStatus);
152+ SetServiceStatus (hServiceStatusHandle, &st_ServiceStatus);
153+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 服务运行中,收到命令,关闭程序" ));
131154 break ;
132155 default :
156+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 服务运行中,收到无法处理的命令:%d" ), dwControl);
133157 break ;
134158 }
135159}
136-
137160// 安装服务
138161void XEngine_InstallService ()
139162{
140- try
163+ TCHAR tszFilePath[MAX_PATH] = {};
164+ if (!GetModuleFileName (NULL , tszFilePath, MAX_PATH))
141165 {
142- wchar_t szPath[MAX_PATH];
143- if (!GetModuleFileNameW (nullptr , szPath, MAX_PATH))
144- {
145- throw std::runtime_error (" GetModuleFileName failed" );
146- }
147-
148- auto hSCManager = std::unique_ptr<std::remove_pointer_t <SC_HANDLE>, decltype (&CloseServiceHandle)>(
149- OpenSCManagerW (nullptr , nullptr , SC_MANAGER_CREATE_SERVICE),
150- CloseServiceHandle
151- );
152- if (!hSCManager)
153- {
154- throw std::runtime_error (" OpenSCManager failed" );
155- }
166+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,安装服务失败,获取文件路径失败,错误码:%d" ), GetLastError ());
167+ return ;
168+ }
169+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 服务运行中,安装服务中,获取本地路径成功:%s" ), tszFilePath);
156170
157- auto hService = std::unique_ptr<std::remove_pointer_t <SC_HANDLE>, decltype (&CloseServiceHandle)>(CreateServiceW (hSCManager.get (), SERVICE_NAME, L" My Modern Service" ,SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,szPath, nullptr , nullptr , nullptr , nullptr , nullptr ),CloseServiceHandle
158- );
159- if (!hService)
160- {
161- throw std::runtime_error (" CreateService failed" );
162- }
171+ SC_HANDLE hSCManager = OpenSCManager (NULL , NULL , SC_MANAGER_CREATE_SERVICE);
172+ if (NULL == hSCManager)
173+ {
174+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,安装服务失败,打开权限错误,错误码:%d" ), GetLastError ());
175+ return ;
176+ }
177+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 服务运行中,安装服务中,打开服务成功" ));
163178
164- std::wcout << L" Service installed successfully\n " ;
179+ SC_HANDLE hService = CreateService (hSCManager, XENGINE_SERVICE_NAME, XENGINE_SERVICE_SHOW, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, tszFilePath, NULL , NULL , NULL , NULL , NULL );
180+ if (NULL == hService)
181+ {
182+ CloseServiceHandle (hSCManager);
183+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,安装服务失败,创建服务失败,错误码:%d" ), GetLastError ());
184+ return ;
165185 }
166- catch (const std::exception& e)
186+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 服务运行中,安装服务中,创建服务成功" ));
187+
188+ SERVICE_DESCRIPTION st_ServiceDescpition = { };
189+ st_ServiceDescpition.lpDescription = const_cast <LPTSTR>(XENGINE_SERVICE_DESCRIPTION); // 描述内容
190+ if (!ChangeServiceConfig2 (hService, SERVICE_CONFIG_DESCRIPTION, &st_ServiceDescpition))
167191 {
168- std::wcerr << L" XEngine_InstallService exception: " << e.what () << L" \n " ;
192+ CloseServiceHandle (hSCManager);
193+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,安装服务失败,设置服务描述失败,错误码:%d" ), GetLastError ());
194+ return ;
169195 }
170- }
196+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X ( " 服务运行中,安装服务中,设置服务描述内容成功 " ));
171197
198+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 服务运行中,安装服务成功" ));
199+ }
172200// 卸载服务
173201void XEngine_UninstallService ()
174202{
175- try
203+ SC_HANDLE hSCManager = OpenSCManager (NULL , NULL , SC_MANAGER_ALL_ACCESS);
204+ if (NULL == hSCManager)
176205 {
177- auto hSCManager = std::unique_ptr<std::remove_pointer_t <SC_HANDLE>, decltype (&CloseServiceHandle)>(OpenSCManagerW (nullptr , nullptr , SC_MANAGER_ALL_ACCESS), CloseServiceHandle);
178- if (!hSCManager)
179- {
180- throw std::runtime_error (" OpenSCManager failed" );
181- }
182- auto hService = std::unique_ptr<std::remove_pointer_t <SC_HANDLE>, decltype (&CloseServiceHandle)>(OpenServiceW (hSCManager.get (), SERVICE_NAME, DELETE), CloseServiceHandle);
183- if (!hService)
184- {
185- throw std::runtime_error (" OpenService failed" );
186- }
206+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,卸载服务失败,打开权限错误,错误码:%d" ), GetLastError ());
207+ return ;
208+ }
209+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 服务运行中,卸载服务中,打开权限成功" ));
187210
188- if (!DeleteService (hService.get ()))
189- {
190- throw std::runtime_error (" DeleteService failed" );
191- }
192- std::wcout << L" Service uninstalled successfully\n " ;
211+ SC_HANDLE hService = OpenService (hSCManager, XENGINE_SERVICE_NAME, DELETE);
212+ if (!hService)
213+ {
214+ CloseServiceHandle (hSCManager);
215+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,卸载服务失败,获取权限失败,错误码:%d" ), GetLastError ());
216+ return ;
193217 }
194- catch (const std::exception& e)
218+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 服务运行中,卸载服务中,获取删除权限成功" ));
219+
220+ if (!DeleteService (hService))
195221 {
196- std::wcerr << L" XEngine_UninstallService exception: " << e.what () << L" \n " ;
222+ CloseServiceHandle (hSCManager);
223+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,卸载服务失败,删除服务失败,错误码:%d" ), GetLastError ());
224+ return ;
197225 }
226+ CloseServiceHandle (hSCManager);
227+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 服务运行中,卸载服务中,删除服务成功" ));
198228}
0 commit comments