1111// History:
1212*********************************************************************/
1313bool bIsRun = false ;
14+ bool bConsole = false ;
1415XHANDLE xhLog = NULL ;
1516XLONG dwProcessID = 0 ;
1617XENGINE_SERVICECONFIG st_ServiceConfig = {};
@@ -77,17 +78,28 @@ int _tmain(int argc, TCHAR* argv[])
7778 XEngine_UninstallService ();
7879 return 0 ;
7980 }
81+ else if (0 == _tcsicmp (argv[1 ], L" -console" ))
82+ {
83+ bConsole = true ;
84+ }
8085 }
81-
82- SERVICE_TABLE_ENTRY ServiceTable[] =
86+
87+ if (bConsole)
8388 {
84- { const_cast <LPTSTR>(XENGINE_SERVICE_NAME), (LPSERVICE_MAIN_FUNCTION)XEngine_ServiceMain },
85- { NULL , NULL }
86- };
87- if (!StartServiceCtrlDispatcher (ServiceTable))
89+ XEngine_ServiceMain (0 , NULL );
90+ }
91+ else
8892 {
89- XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,启动服务控制程序失败,错误:%d" ), GetLastError ());
90- return -3 ;
93+ SERVICE_TABLE_ENTRY ServiceTable[] =
94+ {
95+ { const_cast <LPTSTR>(XENGINE_SERVICE_NAME), (LPSERVICE_MAIN_FUNCTION)XEngine_ServiceMain },
96+ { NULL , NULL }
97+ };
98+ if (!StartServiceCtrlDispatcher (ServiceTable))
99+ {
100+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,启动服务控制程序失败,错误:%d" ), GetLastError ());
101+ return -2 ;
102+ }
91103 }
92104 return 0 ;
93105}
@@ -96,49 +108,68 @@ int _tmain(int argc, TCHAR* argv[])
96108void WINAPI XEngine_ServiceMain (DWORD dwArgc, LPTSTR* lpszArgv)
97109{
98110 XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 启动服务中,开始处理服务程序" ));
99- // 初始化服务状态
100- st_ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
101- st_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
102- st_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
103- st_ServiceStatus.dwWin32ExitCode = 0 ;
104- st_ServiceStatus.dwServiceSpecificExitCode = 0 ;
105- st_ServiceStatus.dwCheckPoint = 0 ;
106- st_ServiceStatus.dwWaitHint = 1000 ;
107- // 注册服务控制处理程序
108- hServiceStatusHandle = RegisterServiceCtrlHandlerW (XENGINE_SERVICE_NAME, XEngine_ServiceCtrlHandler);
109- if (NULL == hServiceStatusHandle)
110- {
111- XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,注册服务控制程序失败,错误:%d" ), GetLastError ());
112- return ;
113- }
114- XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 启动服务中,注册服务控制程序成功" ));
115- // 服务启动完成
116- if (!SetServiceStatus (hServiceStatusHandle, &st_ServiceStatus))
111+ if (!bConsole)
117112 {
118- XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,启动服务设置状态失败,错误:%d" ), GetLastError ());
119- return ;
120- }
121- XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 启动服务中,设置服务程序状态成功" ));
122- // 服务启动完成
123- st_ServiceStatus.dwCheckPoint = 0 ;
124- st_ServiceStatus.dwWaitHint = 0 ;
125- st_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
126- st_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
127- if (!SetServiceStatus (hServiceStatusHandle, &st_ServiceStatus))
128- {
129- XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,启动服务启动状态失败,错误:%d" ), GetLastError ());
130- return ;
113+ // 初始化服务状态
114+ st_ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
115+ st_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
116+ st_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
117+ st_ServiceStatus.dwWin32ExitCode = 0 ;
118+ st_ServiceStatus.dwServiceSpecificExitCode = 0 ;
119+ st_ServiceStatus.dwCheckPoint = 0 ;
120+ st_ServiceStatus.dwWaitHint = 1000 ;
121+ // 注册服务控制处理程序
122+ hServiceStatusHandle = RegisterServiceCtrlHandlerW (XENGINE_SERVICE_NAME, XEngine_ServiceCtrlHandler);
123+ if (NULL == hServiceStatusHandle)
124+ {
125+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,注册服务控制程序失败,错误:%d" ), GetLastError ());
126+ return ;
127+ }
128+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 启动服务中,注册服务控制程序成功" ));
129+ // 服务启动完成
130+ if (!SetServiceStatus (hServiceStatusHandle, &st_ServiceStatus))
131+ {
132+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,启动服务设置状态失败,错误:%d" ), GetLastError ());
133+ return ;
134+ }
135+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 启动服务中,设置服务程序状态成功" ));
136+ // 服务启动完成
137+ st_ServiceStatus.dwCheckPoint = 0 ;
138+ st_ServiceStatus.dwWaitHint = 0 ;
139+ st_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
140+ st_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
141+ if (!SetServiceStatus (hServiceStatusHandle, &st_ServiceStatus))
142+ {
143+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,启动服务启动状态失败,错误:%d" ), GetLastError ());
144+ return ;
145+ }
131146 }
132147 XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 启动服务中,设置服务启动状态成功,服务运行中" ));
133148 bIsRun = true ;
149+
150+ XCHAR tszCurrectDir[MAX_PATH] = {};
151+ XCHAR tszPathBuffer[MAX_PATH] = {};
152+ GetModuleFileNameA (NULL , tszCurrectDir, MAX_PATH);
153+ BaseLib_String_GetFileAndPathA (tszCurrectDir, tszPathBuffer);
154+ _xstrcat (tszPathBuffer, MAX_PATH, _X (" XEngine_HttpApp.exe" ));
155+
156+ if (!SystemApi_Process_CreateProcess (&dwProcessID, tszPathBuffer, " -db 0" , false ))
157+ {
158+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,启动进程失败,错误:%lX" ), SystemApi_GetLastError ());
159+ dwProcessID = 999999 ; // 重置
160+ }
134161 while (bIsRun)
135162 {
136163 SYSTEMAPI_PROCESS_INFOMATION st_ProcessInfo = {};
137164 if (!SystemApi_Process_GetProcessInfo (&st_ProcessInfo, NULL , dwProcessID))
138165 {
139- SystemApi_Process_CreateProcess (&dwProcessID, " ./XEngine_HttpApp.exe" , " -db 0" , st_ServiceConfig.bShowWnd );
166+ if (!SystemApi_Process_CreateProcess (&dwProcessID, tszPathBuffer, " -db 0" , false ))
167+ {
168+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,启动进程失败,错误:%lX" ), SystemApi_GetLastError ());
169+ return ;
170+ }
140171 }
141- Sleep (1000 );
172+ Sleep (5000 );
142173 }
143174}
144175// 服务控制处理函数
@@ -191,25 +222,48 @@ void XEngine_InstallService()
191222 }
192223 XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 服务运行中,安装服务中,打开服务成功" ));
193224
194- 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 );
225+ SC_HANDLE hService = CreateService (hSCManager, XENGINE_SERVICE_NAME, XENGINE_SERVICE_SHOW, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START , SERVICE_ERROR_NORMAL, tszFilePath, NULL , NULL , NULL , NULL , NULL );
195226 if (NULL == hService)
196227 {
197228 CloseServiceHandle (hSCManager);
198229 XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,安装服务失败,创建服务失败,错误码:%d" ), GetLastError ());
199230 return ;
200231 }
201232 XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 服务运行中,安装服务中,创建服务成功" ));
202-
233+ // 设置描述
203234 SERVICE_DESCRIPTION st_ServiceDescpition = { };
204235 st_ServiceDescpition.lpDescription = const_cast <LPTSTR>(XENGINE_SERVICE_DESCRIPTION); // 描述内容
205236 if (!ChangeServiceConfig2 (hService, SERVICE_CONFIG_DESCRIPTION, &st_ServiceDescpition))
206237 {
238+ CloseServiceHandle (hService);
207239 CloseServiceHandle (hSCManager);
208240 XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,安装服务失败,设置服务描述失败,错误码:%d" ), GetLastError ());
209241 return ;
210242 }
211- XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 服务运行中,安装服务中,设置服务描述内容成功" ));
243+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 启动服务中,安装服务中,设置服务描述内容成功" ));
244+ // 设置延迟启动
245+ SERVICE_DELAYED_AUTO_START_INFO st_ServiceDelayedStart = { };
246+ st_ServiceDelayedStart.fDelayedAutostart = TRUE ; // 启用延迟启动
247+ if (!ChangeServiceConfig2W (hService, SERVICE_CONFIG_DELAYED_AUTO_START_INFO, &st_ServiceDelayedStart))
248+ {
249+ CloseServiceHandle (hService);
250+ CloseServiceHandle (hSCManager);
251+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,安装服务失败,设置自动延迟启动失败,错误码:%d" ), GetLastError ());
252+ return ;
253+ }
254+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 启动服务中,安装服务中,设置自动延迟成功" ));
255+ // 启动服务
256+ if (!StartService (hService, 0 , NULL ))
257+ {
258+ CloseServiceHandle (hService);
259+ CloseServiceHandle (hSCManager);
260+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 启动服务中,启动服务失败,错误码:%d" ), GetLastError ());
261+ return ;
262+ }
263+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 启动服务中,服务启动成功" ));
212264
265+ CloseServiceHandle (hService);
266+ CloseServiceHandle (hSCManager);
213267 XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" 服务运行中,安装服务成功" ));
214268}
215269// 卸载服务
0 commit comments