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;
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);
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;
std::vector< std::vector< _variant_t > > table
const T & move(const T &t)
connection< TProtocol > & operator=(const connection< TProtocol > &obj)
bool uninstall_service(std::string const &service_name)