Habréã«ã¯æ¢ã«ãWindowsãµãŒãã¹ãäœæããããšããèšäºããããŸãããç§ã®æèŠã§ã¯ããã®èšäºã¯MSDNã«æ²èŒãããŠããç°¡åãªæŠèŠã«ãããŸããã ããšãã°ããšã©ãŒãçºçããå Žåã®ãµãŒãã¹ã®åäœããŸãã¯ã¡ãã»ãŒãžãã°ãžã®æžã蟌ã¿ã«ã€ããŠèãããããªãã·ã§ã³ã¯èæ ®ãããŸããã
ãã®ãããªã¢ããªã±ãŒã·ã§ã³ãäœæããçµéšã䜿çšããŠãå¯èœãªéãæ倧ã®æ å ±éãè¿°ã¹ãããšããŸãã
ãµãŒãã¹ãããã€ã¹ãã©ã€ããŒãšããŠæ©èœããå ŽåïŒãããã£ãŠãæ¡åŒµåã.sysã®ãã¡ã€ã«ã«ããå ŽåïŒããªãã·ã§ã³ã¯èæ ®ãããŸãããããŸãã«ãç¹æ®ã§ãã
éåžžããµãŒãã¹ã¯åã«SCM ïŒãµãŒãã¹ã³ã³ãããŒã«ãããŒãžã£ãŒïŒã«ãã£ãŠèµ·åãããããã«ãã£ãŠå¶åŸ¡ãããã¢ããªã±ãŒã·ã§ã³ã§ãã ããã°ã©ããŒã«ãšã£ãŠãããã¯ãéå§ããããã«ããã€ãã®è¿œå ã¢ã¯ã·ã§ã³ãæäŸããå¿ èŠãããããšãæå³ããŸãã
ããã«ãæ£ãããµãŒãã¹ããŠãŒã¶ãŒãšçŽæ¥å¯Ÿè©±ããªãããã«ããå¿ èŠããããŸãã ããã¯å®éã«ã¯ã©ãããæå³ã§ããïŒ ã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšããã®ã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ãœãŒã«ãŠã£ã³ããŠãŸãã¯GUIã衚瀺ãããŸãã Windows 2000 / Windows XP / Windows 2003 Serverãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãå®è¡ããã·ã¹ãã ãµãŒãã¹ãèš±å¯ãããŸãããã®ãµãŒãã¹ã¯ã€ã³ã¿ã©ã¯ãã£ããšåŒã°ããŸãã ããããåæã«ã Windows Vistaããéå§-ã€ã³ã¿ã©ã¯ãã£ããµãŒãã¹ã®çŠæ¢ã ãµãŒãã¹ãéçºãããšãã察話æ§ãæŸæ£ããæ¹ãæ£ããããšãããããŸãã
åæã«ãMSDNèªäœã«ã¯ããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³çšã®æ¬¡ã®ãªãã·ã§ã³ãçšæãããŠããŸãã
1ïŒ WTSSendMessageïŒïŒé¢æ°ã䜿çšããŠãã€ã¢ãã°ã衚瀺ãã
åäœã¯éåžžã«æè»æ§ãããããã€ã¢ãã°ã衚瀺ããŠãŠãŒã¶ãŒã®åå¿ãåŸ ã€ããšãã§ããŸãããŠãŒã¶ãŒã«éç¥ããŠã¢ããªã±ãŒã·ã§ã³ãç¶è¡ããããšãªã©ãã§ããŸããããµãŒãã¹ã¯ã¿ãŒããã«ã»ãã·ã§ã³ã§åäœããããçŸåšã®ã¿ãŒããã«ã»ãã·ã§ã³ã§ã¢ã¯ãã£ããªãŠãŒã¶ãŒã«äŸåããå¿ èŠããããŸããããã¢ãããŠã£ã³ããŠã«å¿çããããã®ç¥èãšæš©å©ïŒITã«ç²ŸéããŠããªãå€ãã®äººã ããã®åäœãæããŠããŸããããã¯èšèšæã«ãèæ ®ããå¿ èŠããããŸãïŒ
2ïŒ CreateProcessAsUserïŒïŒã䜿çšããŠçŸåšã®ãŠãŒã¶ãŒã»ãã·ã§ã³ã§å¥ã®ã¢ããªã±ãŒã·ã§ã³ãäœæãã
ãŠãŒã¶ãŒã«ãµãŒãã¹ãšå¯Ÿè©±ããããã®ã·ã³ãã«ãªããŒã«ãæäŸãããã ãã§ãããããœã±ããïŒæãäžè¬çãªãªãã·ã§ã³ïŒããŸãã¯IPCãCOMãªã©ã®äžè¬çãªã³ãŒããå€å°è€éã«ãã察話ãæŽçããå¿ èŠãããããšãç解ããå¿ èŠãããå Žåãæãæ£ãããªãã·ã§ã³ãããããµãŒãã¹èªäœãç°¡çŽ åããŸãã
åå¥ã®å®è¡å¯èœãã¡ã€ã«ãäœæããã«ãç¹å®ã®ããŒã§èµ·åãããåããµãŒãã¹ãã¡ã€ã«ã䜿çšããããšãã§ããŸããããã«ãããããã°ã©ã ã®é åžãšæŽæ°ãå€å°ç°¡åã«ãªããŸãã
3ïŒãã©ã¡ãŒã¿MB_SERVICE_NOTIFICATIONã䜿çšããŠMessageBoxïŒïŒãåŒã³åºããŸã
ææªã®ã·ããªãªã¯ããŠãŒã¶ãŒã®å¿çã®éããµãŒãã¹ïŒãŸãã¯ãããåŒãèµ·ãããã¹ã¬ããïŒãããã³ã°ãããããšã§ãã
ã·ã¹ãã ã«ãµãŒãã¹ãã€ã³ã¹ããŒã«ãŸãã¯ã¢ã³ã€ã³ã¹ããŒã«ãããšãã¯ã管çè ããŸãã¯ãããšåçã®æš©éãæã€ãŠãŒã¶ãŒã®ã¿ãSCMãšå¯Ÿè©±ããæš©éãæã£ãŠããããšãèæ ®ããå¿ èŠããããŸãã
ããã«ããµãŒãã¹ã®äœæ¥ãã©ã«ããŒã¯ã·ã¹ãã ã®System32ã§ããããµãŒãã¹ãã€ã³ã¹ããŒã«ãããŠãããã©ã«ããŒã«æžã蟌ãæš©éããªãå¯èœæ§ããããŸãããã®ãããã·ã¹ãã èªäœã®ã€ãã³ããã°ããã°ã«äœ¿çšããå¿ èŠããããŸãïŒä»¥äžãåç §ïŒã
ã³ãŒããåŒçšããåã«ãNTã·ã¹ãã çšã®ãµãŒãã¹ãéçºããå Žåããã¯ãã§å±éãããããšãä¿¡é Œããã«å®å šãªé¢æ°åãå人çã«äœæããããšã奜ãããã OpenSCManagerã®ä»£ããã«ãéåžžOpenSCManagerWãèšè¿°ããŸã ã
ãããŠããŸãæåã«ã
ãµãŒãã¹ãšã³ããªãã€ã³ãã¯ãã³ã³ãœãŒã«é¢æ°mainïŒïŒãŸãã¯WinMainïŒïŒã®ããããã§ãã ã€ãã£ãªãã®ãŒçã«serisisã¯ã³ã³ãœãŒã«ãããžã§ã¯ãã§ã¯ãªãããã2çªç®ã®é¢æ°ã䜿çšããŸãã
é¢æ°èªäœã§ã¯ãã³ãã³ãã©ã€ã³ããŒãµãŒãäœæãã install ã uninstall ã runããã³stop ã³ãã³ãã®åŠçãæäŸããå¿ èŠããããŸããå¿ èŠã«å¿ããŠå®è¡ã§ããŸãã ãã©ã¡ãŒã¿ãŒãªãã®å®è¡å¯èœãã¡ã€ã«ã®èµ·åã¯ãSCMãä»ãããµãŒãã¹ã®èµ·åãšããŠæ€èšããŸãã ãããæãæ£ããåäœã§ãã 誰ããããŒãªãã§ãã¡ã€ã«ãå®è¡ããããšãããšããµãŒãã¹ã¯éå§ãããŸãããå¿ èŠãªã³ãã³ããåŠçããããšã«ãããã³ã³ãœãŒã«ã®ã³ãã³ããšãã©ã¡ãŒã¿ãŒãèŠããããšãªãããµãŒãã¹ã®åäœãç°¡åã«å¶åŸ¡ã§ããŸãã
ããã«ããµãŒãã¹ãå®è¡ãããŠãããã©ãããããã³ã·ã¹ãã ã«ã€ã³ã¹ããŒã«ãããŠãããã©ããã確èªããã«ã¯ãããã€ãã®æ©èœãå¿ èŠã§ãã
Copy Source | Copy HTML<br/> /* <br/> */ <br/> bool is_install()<br/>{<br/> bool Result = false ;<br/> SC_HANDLE l_srv_manager = NULL;<br/> SC_HANDLE l_srv_process = NULL;<br/> <br/> l_srv_manager = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);<br/> if (l_srv_manager)<br/> {<br/> l_srv_process = OpenServiceW(<br/> l_srv_manager,<br/> g_str_srv_name.c_str(),<br/> SERVICE_ALL_ACCESS<br/> );<br/> if (l_srv_process)<br/> {<br/> Result = true ;<br/> CloseServiceHandle(l_srv_process);<br/> }<br/> CloseServiceHandle(l_srv_manager);<br/> }<br/> else <br/> /* <br/> */ <br/> MessageBoxW(<br/> 0 ,<br/> L "Cannot connect to Service Manager\ntry run with Administrator right !" ,<br/> L "ERROR" ,<br/> MB_ICONERROR<br/> );<br/> return Result;<br/>}<br/> //------------------------------------------------------------------------------ <br/>
Copy Source | Copy HTML<br/> /* <br/> */ <br/> bool is_run()<br/>{<br/> if (!is_install())<br/> return false ;<br/> <br/> bool Result = false ;<br/> SC_HANDLE l_srv_manager = NULL;<br/> SC_HANDLE l_srv_process = NULL;<br/> <br/> l_srv_manager = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);<br/> if (l_srv_manager)<br/> {<br/> l_srv_process = OpenServiceW(<br/> l_srv_manager,<br/> g_str_srv_name.c_str(),<br/> SERVICE_ALL_ACCESS<br/> );<br/> if (l_srv_process)<br/> {<br/> SERVICE_STATUS_PROCESS l_srv_status;<br/> DWORD l_dw_temp;<br/> if (QueryServiceStatusEx(<br/> l_srv_process,<br/> SC_STATUS_PROCESS_INFO,<br/> reinterpret_cast< LPBYTE > (&l_srv_status),<br/> sizeof (SERVICE_STATUS_PROCESS),<br/> &l_dw_temp<br/> ) == TRUE<br/> )<br/> {<br/> if (l_srv_status.dwCurrentState == SERVICE_RUNNING)<br/> Result = true ;<br/> }<br/> CloseServiceHandle(l_srv_process);<br/> }<br/> CloseServiceHandle(l_srv_manager);<br/> }<br/> else <br/> /* <br/> */ <br/> MessageBoxW(<br/> 0 ,<br/> L "Cannot connect to Service Manager\ntry run with Administrator right !" ,<br/> L "ERROR" ,<br/> MB_ICONERROR<br/> );<br/> return Result;<br/>}<br/> //------------------------------------------------------------------------------ <br/>
以äžãg_str_srv_nameã¯ããµãŒãã¹ã®ååãå«ãæååstd :: wstringã§ãã
Copy Source | Copy HTML<br/> /* <br/> */ <br/> int srv_install()<br/>{<br/> if (is_install())<br/> return srv_start();<br/> <br/> int Result = - 1 ;<br/> SC_HANDLE l_srv_manager = NULL;<br/> SC_HANDLE l_srv_process = NULL;<br/> <br/> l_srv_manager = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);<br/> if (l_srv_manager)<br/> {<br/> std::wstring l_wstr = get_path();<br/> <br/> l_srv_process = CreateServiceW(<br/> l_srv_manager,<br/> g_str_srv_name.c_str(),<br/> g_str_srv_name.c_str(),<br/> SERVICE_ALL_ACCESS,<br/> SERVICE_WIN32_OWN_PROCESS,<br/> SERVICE_AUTO_START,<br/> SERVICE_ERROR_NORMAL,<br/> (l_wstr + get_name()).c_str(),<br/> NULL,<br/> NULL,<br/> NULL,<br/> NULL,<br/> NULL<br/> );<br/> if (l_srv_process)<br/> {<br/> registry_editor_t l_reg_edit;<br/> <br/> Result = 0 ;<br/> <br/> HKEY l_kservice = NULL;<br/> <br/> SERVICE_DESCRIPTIONW l_srv_descr;<br/> SERVICE_FAILURE_ACTIONSW l_srv_action_f;<br/> SC_ACTION l_srv_action [] =<br/> {<br/> { SC_ACTION_RESTART, 500 },<br/> { SC_ACTION_RESTART, 500 },<br/> { SC_ACTION_RESTART, 500 }<br/> };<br/> <br/> l_srv_descr.lpDescription = const_cast< wchar_t *> (g_str_srv_descr.c_str());<br/> l_srv_action_f.dwResetPeriod = 120 ;<br/> l_srv_action_f.lpRebootMsg = NULL;<br/> l_srv_action_f.lpCommand = NULL;<br/> l_srv_action_f.cActions = 3 ;<br/> l_srv_action_f.lpsaActions = l_srv_action ;<br/> <br/> ChangeServiceConfig2W(<br/> l_srv_process,<br/> SERVICE_CONFIG_DESCRIPTION,<br/> &l_srv_descr<br/> );<br/> ChangeServiceConfig2W(<br/> l_srv_process,<br/> SERVICE_CONFIG_FAILURE_ACTIONS,<br/> &l_srv_action_f<br/> );<br/> <br/> // HKEY_LOCAL_MACHINE\Software\MyService <br/> l_kservice = l_reg_edit.create(<br/> registry_editor_t::root::local_mashine,<br/> L "Software\\MyService" <br/> );<br/> if (l_kservice)<br/> {<br/> l_reg_edit.write(l_kservice, L "Path" , l_wstr);<br/> l_reg_edit.close(l_kservice);<br/> }<br/> <br/> // HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\* <br/> DWORD l_support = EVENTLOG_ERROR_TYPE |<br/> EVENTLOG_WARNING_TYPE |<br/> EVENTLOG_INFORMATION_TYPE;<br/> HKEY l_kevent_log = l_reg_edit.create(<br/> registry_editor_t::root::local_mashine,<br/> (L "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\MySvrMessages" ).c_str()<br/> );<br/> if (l_kevent_log)<br/> {<br/> l_reg_edit.write(<br/> l_kevent_log,<br/> L "EventMessageFile" ,<br/> l_wstr + L "messages.dll" <br/> );<br/> l_reg_edit.write(<br/> l_kevent_log,<br/> L "TypesSupported" ,<br/> l_support<br/> );<br/> l_reg_edit.write(<br/> l_kevent_log,<br/> L "CategoryMessageFile" ,<br/> l_wstr + L "messages.dll" <br/> );<br/> l_support = 3 ;<br/> l_reg_edit.write(<br/> l_kevent_log,<br/> L "CategoryCount" ,<br/> l_support<br/> );<br/> }<br/> <br/> // start service <br/> StartServiceW(l_srv_process, 0 , NULL);<br/> <br/> CloseServiceHandle(l_srv_process);<br/> }<br/> else <br/> {<br/> /* <br/> */ <br/> std::wstring l_wstr = L "Installation service failed\n" ;<br/> l_wstr += get_error();<br/> MessageBoxW( 0 , l_wstr.c_str(), L "ERROR" , MB_ICONERROR);<br/> }<br/> <br/> CloseServiceHandle(l_srv_manager);<br/> }<br/> else <br/> /* <br/> */ <br/> MessageBoxW(<br/> 0 ,<br/> L "Cannot connect to Service Manager\ntry run with Administrator right !" ,<br/> L "ERROR" ,<br/> MB_ICONERROR<br/> );<br/> return Result;<br/>}<br/> //------------------------------------------------------------------------------ <br/>
ããã§äœãè¡ããããèŠãŠã¿ãŸãããïŒ
1ïŒget_pathïŒïŒ/ get_nameïŒïŒã¯ããµãŒãã¹å®è¡å¯èœãã¡ã€ã«ã眮ãããŠãããã©ã«ããŒã®ååãšãã®å®è¡å¯èœãã¡ã€ã«ã®ååãååŸããæ©èœã§ãã Samopisnyeã®ã§ãå®è£ ã¯ä»»æã§ãã
2ïŒSERVICE_WIN32_OWN_PROCESSãã©ã°ã®å€ã¯ãã»ãšãã©ã®ãµãŒãã¹ã«é©ããŠããŸãã äŸå€ã¯ãããã€ã¹ãã©ã€ããŒããã³ãã¡ã€ã«ã·ã¹ãã ãšã¯èŠãªãããŸããã ãã®èšäºã®ãã¬ãŒã ã¯ãŒã¯ã§2çªç®ã«å¯èœãªãã©ã°ã¯SERVICE_WIN32_SHARE_PROCESSãã©ã°ã§ããããã¯ããµãŒãã¹ããã»ã¹ãä»ã®ãµãŒãã¹ãšå ±éã®ã¡ã¢ãªé åãæã£ãŠããããšãæå³ããŸãã1ã€ã®å®è¡å¯èœãã¡ã€ã«ã«è€æ°ã®ãµãŒãã¹ãããå Žåãããã¯å¿ é ã§ãã äžè¬çãªã¡ã¢ãªé åã䜿çšãããšãRAMãç¯çŽããŠãµãŒãã¹ã®ããåããç°¡çŽ åã§ããŸããããããã°ãéåžžã«è€éã«ãªããŸãããããã£ãŠããã®æ©èœã䜿çšããçç±ã¯ãå¿ èŠãªçç±ãšãã®ä»ã®çç±ãæ確ã«ç解ããããšã ãã§ãã
3ïŒSERVICE_AUTO_START-ã·ã¹ãã ã®èµ·åæã«ãµãŒãã¹ãèªåçã«éå§ãããŸãã ãã®å ŽåããµãŒãã¹ãéå§ãããç¬éã¯ãã·ã¹ãã ãµãŒãã¹ã®åæåãã€ãŸã ãŠãŒã¶ãŒããã°ã€ã³ããåã ãµãŒãã¹ããµãŒããŒã§å®è¡ãããŠããå Žåããã®ç¹ãèæ ®ããå¿ èŠããããŸãã ãã¬ãŒã ã¯ãŒã¯å ã®ãã®ä»ã®å¯èœãªãªãã·ã§ã³ãSERVICE_DEMAND_START-æåã§éå§ãããã³SERVICE_DISABLED-ãŸã£ããéå§ããŸããã
4ïŒ SERVICE_FAILURE_ACTIONSWæ§é äœã¯ããµãŒãã¹ã®ç·æ¥çµäºæã®SCMã®åäœãèšè¿°ããŸãã
* dwResetPeriod-ç§åäœã§èšå®ãããããµãŒãã¹ã®åäœã«é¢ããããŒã¿ããŒãã«ããæéã INFINITEã®å€ã¯ãããŒã¿ãäžæžããããªãããšã瀺ããŸãã
* cActions-ãµãŒãã¹ã®ç·æ¥æã®åäœã«å¯ŸããSCMã®åå¿ãèšè¿°ããé åå ã®èŠçŽ ã®æ°ãéåžžããã®æ°ã¯3ïŒ3ïŒã§ãã é ç®ãæåã®å€±æããã2çªç®ã®å€±æããããã³ããã®åŸã®å€±æãã«ãããšïŒ

ãããã£ãŠãl_srv_action []é åã«{SC_ACTION_RESTARTã500}ãã£ãŒã«ããå ¥åãããšãã¯ã©ãã·ã¥åŸ500ããªç§ããšã«ãµãŒãã¹ãèªåçã«åèµ·åãããŸãã
ãããã®ãã£ãŒã«ãã«å ¥åããããã¹ãŠã®æ å ±ã¯ãã¬ãžã¹ããªãã©ã³ãã«ä¿åãããŸã
HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services \ MyService
ããã«ããµãŒãã¹ã¡ãã»ãŒãžã®åŠçãè¿œå ããå¿ èŠããããŸãããã®ããã«ãã¬ãžã¹ããªHKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services \ EventLogã«ç¹å¥ãªãã©ã³ããè¿œå ããŸã ã ãã®ãã©ã³ãã§ã¯ãMMCããã°ã«èšé²ããããšã©ãŒã®èª¬æãèŠã€ããããšãã§ãããªãœãŒã¹å ã®ãã¡ã€ã«ãæå®ããå¿ èŠããããŸãã ååãšããŠããããã®ãªãœãŒã¹ãå®è¡å¯èœãã¡ã€ã«ã«è¿œå ã§ããŸãããå¥ã®åçã©ã€ãã©ãªïŒç§ã®å Žåã¯messages.dllïŒãäœæããæ¹ãç°¡åã§ãããã®ã©ã€ãã©ãªã®äœææ¹æ³-以äžã«èšè¿°ããŸãã
ããŠãããã§ã€ã³ã¹ããŒã«ã¯å®äºã§ãã
ãµãŒãã¹ã®åé€ãéå§ãåæ¢ã«ã€ããŠã¯ãããããŒã®èšäºãã芧ãã ããããããã®æé ã®ã³ãŒãã«ã¯ç¹å¥ãªãã®ã¯ãããŸããã
ãã®çµæãã€ã³ã¹ããŒã«ãåé€ãããã³ãã®ä»ã®ã³ãã³ããããçšåºŠææ¡ãããããããã«ç¶è¡ã§ããŸãã
ãµãŒãã¹ãžã®ãšã³ããªãã€ã³ãã¯åã®èšäºã§è©³ãã説æãããŠããã®ã§ãããã€ãã®èª¬æã®ã¿ãè¿œå ããŸãã
ãµãŒãã¹ã¯ãWinMainïŒïŒã«å ¥ã£ãŠãã30ç§ä»¥å ã«StartServiceCtrlDispatcherWïŒïŒãåŒã³åºãå¿ èŠããããŸããããããªããšãSCMã¯å®è¡äžã®ããã»ã¹ãããªãŒãºããã³ã¢ã³ããŒãããããšã決å®ããŸãã
ããã«ããµãŒãã¹ã®æãæ£ããåäœã¯ãæåã«ã¹ããŒã¿ã¹ããéå§ããšããŠå®£èšãã次ã«ããããéå§ãã«å€æŽããããšã§ããããµãŒãã¹ã®ã¹ããŒã¿ã¹ãããã«ãéå§ãã«èšå®ããããšã劚ãããã®ã¯ãããŸããã
ãããè¡ãã«ã¯ãServiceMainã§æ¬¡ã®æé ãå®è¡ããå¿ èŠããããŸãã
Copy Source | Copy HTML<br/> /* <br/> */ <br/> void service_t::main()<br/>{<br/> m_handle = RegisterServiceCtrlHandlerExW(<br/> g_str_srv_name.c_str(),<br/> &service_handler,<br/> NULL<br/> );<br/> if (!m_handle)<br/> {<br/> system_logger_t::instance()->trace_info(<br/> L "register service handler failed" <br/> );<br/> _set_stop();<br/> return ;<br/> }<br/> // <br/> m_status.dwCurrentState = SERVICE_START_PENDING;<br/> m_status.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;<br/> m_status.dwServiceSpecificExitCode = ERROR_NOT_READY;<br/> m_status.dwWaitHint = 5000 ;<br/> if (SetServiceStatus(m_handle, &m_status) == FALSE)<br/> {<br/> std::wstring l_error = get_error();<br/> system_logger_t::instance()->trace_info(l_error);<br/> _set_stop();<br/> return ;<br/> }<br/> // <br/> SetUnhandledExceptionFilter(exception_filter);<br/> SetErrorMode(SEM_FAILCRITICALERRORS);<br/> // init <br/> // ---- <br/> m_status.dwControlsAccepted = SERVICE_ACCEPT_STOP |<br/> SERVICE_ACCEPT_SESSIONCHANGE |<br/> SERVICE_ACCEPT_SHUTDOWN;<br/> m_status.dwWin32ExitCode = NO_ERROR;<br/> m_status.dwCurrentState = SERVICE_RUNNING;<br/> m_status.dwWaitHint = 0 ;<br/> if (SetServiceStatus(m_handle, &m_status) == FALSE)<br/> {<br/> std::wstring l_error = get_error();<br/> trace_msg(l_error);<br/> system_logger_t::instance()->trace_info(l_error);<br/> return ;<br/> }<br/> m_run = true ;<br/> system_logger_t::instance()->trace_info(<br/> L "service start success" <br/> );<br/> while ( true )<br/> {<br/> if (!m_run)<br/> {<br/> break ;<br/> }<br/> else <br/> Sleep( 10 );<br/> }<br/> _set_stop();<br/>}<br/> //------------------------------------------------------------------------------ <br/> /* <br/> */ <br/> void service_t::_set_stop()<br/>{<br/> m_status.dwCurrentState = SERVICE_STOPPED;<br/> SetServiceStatus(m_handle, &m_status);<br/> system_logger_t::instance()->trace_info(<br/> L "MyService stop" <br/> );<br/>}<br/> //------------------------------------------------------------------------------ <br/>
ããã§ããµãŒãã¹ã¯SCMã«åæåã«5ç§ãå¿ èŠã§ããããšãäŒããŸããã€ãŸãããããã®5ç§ãçµéããåã«ãSCMã«åæåãå®äºããããšãéç¥ããå¿ èŠããããŸãã ãã以å€ã®å ŽåããµãŒãã¹ã¯åçµãããç¶æ ã§ã¢ã³ããŒããããŸãã
äžèšã®ã³ãŒãã¯ããµãŒãã¹ã¯ã©ã¹ã®åæåäžã«ãæ§é ãã£ãŒã«ãã次ã®ããã«å ¥åãããããšãåæãšããŠããŸãã
memset(&m_status, 0, sizeof(SERVICE_STATUS));
m_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
åæã«ã dwServiceTypeãã£ãŒã«ãã®å€ã¯ãã€ã³ã¹ããŒã«äžã«æå®ãããµãŒãã¹ã®ã¿ã€ãã«å¯Ÿå¿ããå¿ èŠããããŸããããããªããšãSCMã¯ããã誀ã£ãåäœãšèŠãªãããµãŒãã¹ã®éå§ã劚ããŸãã
ãšã©ãŒã¡ãã»ãŒãžãé衚瀺ã«ããŠäŸå€ããã£ãããããšãããã°ã©ã ã³ãŒãå ã®ãšã©ãŒãåå¥ã«åŠçã§ãããµãŒãã¹ã®ããªãŒãºãåé¿ã§ããå ŽåããããŸãã ããã«ãããã«ããããŠãŒã¶ãŒã¯ãã€ã¯ããœããã®éçºè ã«ãã°ã¬ããŒããéä¿¡ããå¿ èŠããªããªããŸãã
ä»ã®ããã°ã©ã ãæ£åžžã«æ©èœãããããã«ã SleepïŒ10ïŒãµãŒãã¹ãã¡ã€ã³ã«ãŒãã®æ¬äœã«æ¿å ¥ããã®ãèªç¶ã§ãïŒãã®èª¬æã¯ãã®èšäºã®ç¯å²å€ã§ãïŒã
ç§ã®ã¡ãã»ãŒãžãã³ãã©ã¯æ¬¡ã®ããã«ãªããŸãã
Copy Source | Copy HTML<br/> /* <br/> */ <br/>DWORD service_t::handler(DWORD dwControl,<br/> DWORD dwEnterType,<br/> LPVOID lpEventData,<br/> LPVOID lpContext)<br/>{<br/> switch (dwControl)<br/> {<br/> case SERVICE_CONTROL_STOP:<br/> case SERVICE_CONTROL_SHUTDOWN:<br/> system_logger_t::instance()->trace_info(<br/> L "service try to stop" <br/> );<br/> m_status.dwCurrentState = SERVICE_STOP_PENDING;<br/> m_status.dwWaitHint = 10000 ;<br/> SetServiceStatus(m_handle, &m_status);<br/> m_run = false ;<br/> break ;<br/> case SERVICE_CONTROL_SESSIONCHANGE:<br/> break ;<br/> default :<br/> SetServiceStatus(m_handle, &m_status);<br/> }<br/> return NO_ERROR;<br/>}<br/> //------------------------------------------------------------------------------ <br/>
å®éãã€ã³ã¿ãŒãããäžã§æãå°ãªãã«ãã¬ããžã®æ®ãã¯ããµãŒãã¹ããã·ã¹ãã ãã°ã«ã¡ãã»ãŒãžãæ£ããè¿œå ããæ¹æ³ã§ãã ã©ã€ãã©ãªãŒãã¬ãžã¹ããªãŒã«ç»é²ããæ¹æ³ã«ã€ããŠã¯æ¢ã«äžèšã§èª¬æããŸããããä»ã¯ãã®ã©ã€ãã©ãªãŒãäœæããæ¹æ³ã«ã€ããŠèª¬æããŸããã
1ïŒæ¬¡ã®å 容ã®æ¡åŒµå.mcã®ãã¡ã€ã«ãäœæããŸãã
Copy Source | Copy HTML<br/>MessageIdTypedef = DWORD<br/>SeverityNames =<br/> (<br/> Success = 0x0 : STATUS_SEVERITY_SUCCESS<br/> Informational = 0x1 : STATUS_SEVERITY_INFORMATIONAL<br/> Warning = 0x2 : STATUS_SEVERITY_WARNING<br/> Error = 0x3 : STATUS_SEVERITY_ERROR<br/> )<br/> <br/>FacilityNames =<br/> (<br/> System = 0x0 : FACILITY_SYSTEM<br/> Runtime = 0x2 : FACILITY_RUNTIME<br/> Io = 0x3 : FACILITY_IO_ERROR_CODE<br/> )<br/> <br/>LanguageNames =<br/> (<br/> English = 0x409 : MSG00409<br/> )<br/> <br/> ;// messages definition<br/>MessageId = 0x1<br/>Severity = Success<br/>Facility = System<br/>SymbolicName = SRV_MSG_SYSTEM_SUCCESS<br/>Language = English<br/>Operation %1 success<br/>. <br/>
ã¡ãã»ãŒãžã®éèŠåºŠã®4ã€ã®ã¬ãã«ã¯äºçŽãããŠãããå€æŽãã¹ãã§ã¯ãããŸãããããªããžã§ã¯ãã€ã³ããã¯ã¹ïŒFacilityNamesïŒã¯ä»»æã§ãã 説æã®å®æã¯æ°ããè¡ã®ãã€ã³ãã§ããããããå¿ããŠã¯ãªããŸããã
MessageIDã¯ãèšè¿°ãããŠããã¡ãã»ãŒãžã®çš®é¡ããšã«äžæã§ããå¿ èŠããããŸãïŒ1ã2ã3ãªã©ïŒ
ãã®ãã¡ã€ã«ã¯ããªãœãŒã¹ãã¡ã€ã«ã«ãã³ã³ãã€ã«ãããå¿ èŠããããŸãããã®ãããMSVSãã£ã¹ããªãã¥ãŒã·ã§ã³ã«ã¯mc.exeãå«ãŸããŠããã.mcãã¡ã€ã«ãã.hããã³.rcãã¡ã€ã«ãäœæããŸãã
ãŠãŒãã£ãªãã£ã«ãã£ãŠçæãããããããŒãã¡ã€ã«ã¯ãããžã§ã¯ãã«æ¥ç¶ãããŠããå¿ èŠãããããªãœãŒã¹ãã¡ã€ã«ã¯ã©ã€ãã©ãªã«åéãããŠããïŒãŸãã¯å®è¡å¯èœãã¡ã€ã«ã«æ¥ç¶ãããŠããïŒå¿ èŠããããŸãã
rc -r messages.rc
link -dll -noentry -out:messages.dll messages.res
èå³æ·±ãæ©èœã¯ãã¡ãã»ãŒãžãæ£ãã圢åŒã§è¡šç€ºããã«ã¯ãEventlogãµãŒãã¹ã®åèµ·åãå¿ èŠãªããšã§ãã ãã以å€ã®å Žåã¯ã次ã®ãããªãã®ã衚瀺ãããŸãã
( 1 ) ( MySrvMessages ). , DLL . /AUXSOURCE= , - . : service starting.
è¯ãæ©äŒã¯ããµãŒãã¹ãç¬èªã®ã¡ãã»ãŒãžãã°ãä¿æã§ããäžè¬çãªã¢ããªã±ãŒã·ã§ã³ã«è¿œå ã§ããªãããšã§ãã ãããè¡ãã«ã¯ãã¡ãã»ãŒãžèšè¿°ã©ã€ãã©ãªãç»é²ãããšãã«ã HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ Applicationãã©ã³ãã§ã¯ãªãã HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ MyServiceãæå®ããå¿ èŠããããŸãã
ããããèå³æ·±ããã¥ã¢ã³ã¹ããããŸãã
MMCã§ã¬ãžã¹ããªãã©ã³ããäœæãããšã察å¿ãããã©ã«ããŒããã€ãã³ããã«è¡šç€ºãããŸãããå Žåã«ãã£ãŠã¯ãã€ãã³ããã°ãåèµ·åããåŸã§ããã®ãã©ã³ãããã®ã¡ãã»ãŒãžãæ£ããåŠçãããŸããã ãã®ãããªãé倧ãªã±ãŒã¹ãã§ã¯ãã³ã³ãã¥ãŒã¿ãŒã®åèµ·åãå¿ èŠã«ãªããŸãããããã¯ãµãŒããŒã«ãšã£ãŠåé¡ãšãªãå¯èœæ§ããããŸãã ãããã幞ããªããšã«ãããã¯éåžžã«ãŸãã§ãã
ãŸããããããã¹ãŠã§ãã å€ãã®ããã¹ããå€ãã®ã³ãŒããå€æããŸããããããããç§ã®æèŠã§ã¯ãç¥ã£ãŠããå¿ èŠãããæäœéã®ãã®ã§ãã æ®ãã¯ãã€ã³ã¿ãŒããããšMSDNããç°¡åã«åŠã¶ããšãã§ããŸãã