46 std::vector<char> vecstring(std::string
const & str)
48 std::vector<char> result{str.begin(), str.end()};
49 result.push_back(
'\0');
54 template <
typename T_handler>
55 class t_service_runner final
58 SERVICE_STATUS_HANDLE m_status_handle{
nullptr};
59 SERVICE_STATUS m_status{};
60 boost::mutex m_lock{};
64 static std::unique_ptr<t_service_runner<T_handler>> sp_instance;
71 , m_handler{
std::move(handler)}
73 m_status.dwServiceType = SERVICE_WIN32;
74 m_status.dwCurrentState = SERVICE_STOPPED;
75 m_status.dwControlsAccepted = 0;
76 m_status.dwWin32ExitCode = NO_ERROR;
77 m_status.dwServiceSpecificExitCode = NO_ERROR;
78 m_status.dwCheckPoint = 0;
79 m_status.dwWaitHint = 0;
82 t_service_runner & operator=(t_service_runner && other)
86 m_status_handle = std::move(other.m_status_handle);
87 m_status = std::move(other.m_status);
88 m_name = std::move(other.m_name);
89 m_handler = std::move(other.m_handler);
99 sp_instance.reset(
new t_service_runner<T_handler>{
110 SERVICE_TABLE_ENTRY table[] =
112 { vecstring(m_name).data(), &service_main }
116 StartServiceCtrlDispatcher(table);
119 void report_status(DWORD status)
121 m_status.dwCurrentState = status;
122 if (status == SERVICE_RUNNING)
124 m_status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
126 else if(status == SERVICE_STOP_PENDING)
128 m_status.dwControlsAccepted = 0;
130 SetServiceStatus(m_status_handle, &m_status);
133 static void WINAPI service_main(DWORD argc, LPSTR * argv)
135 sp_instance->service_main_(argc, argv);
138 void service_main_(DWORD argc, LPSTR * argv)
140 m_status_handle = RegisterServiceCtrlHandler(m_name.c_str(), &on_state_change_request);
141 if (m_status_handle ==
nullptr)
return;
143 report_status(SERVICE_START_PENDING);
145 report_status(SERVICE_RUNNING);
149 on_state_change_request_(SERVICE_CONTROL_STOP);
155 static void WINAPI on_state_change_request(DWORD control_code)
157 sp_instance->on_state_change_request_(control_code);
160 void on_state_change_request_(DWORD control_code)
162 switch (control_code)
164 case SERVICE_CONTROL_INTERROGATE:
166 case SERVICE_CONTROL_SHUTDOWN:
167 case SERVICE_CONTROL_STOP:
168 report_status(SERVICE_STOP_PENDING);
170 report_status(SERVICE_STOPPED);
172 case SERVICE_CONTROL_PAUSE:
174 case SERVICE_CONTROL_CONTINUE:
182 template <
typename T_handler>
183 std::unique_ptr<t_service_runner<T_handler>> t_service_runner<T_handler>::sp_instance;
const char * name
Definition: simplewallet.cpp:400
Definition: blockchain_ancestry.cpp:73
Definition: windows_service.cpp:47
bool uninstall_service(std::string const &service_name)
Definition: windows_service.cpp:328