Skip to content

Commit 0760ff1

Browse files
committed
added:console start for windows service and set auto start
1 parent a783028 commit 0760ff1

File tree

1 file changed

+98
-44
lines changed

1 file changed

+98
-44
lines changed

XEngine_Source/XEngine_ServiceApp/XEngine_APIServiceApp/XEngine_APIServiceApp.cpp

Lines changed: 98 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
// History:
1212
*********************************************************************/
1313
bool bIsRun = false;
14+
bool bConsole = false;
1415
XHANDLE xhLog = NULL;
1516
XLONG dwProcessID = 0;
1617
XENGINE_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[])
96108
void 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

Comments
 (0)