#ifndef __SERVICE_APP_H__ #define __SERVICE_APP_H__ #pragma once //#include /* < ¼­ºñ½º »ý¼ºÇÏ´Â ¹ý > ½ÃÀÛ - ½ÇÇà¿¡¼­ cmd¸¦ ½ÇÇà½ÃÄѼ­.. c:/> sc c:/> sc create ÇÏ¸é µµ¿ò¸»ÀÌ ³ª¿É´Ï´Ù. ex) sc create TestService binPath= d:\project\testservice.exe DisplayName= Å×½ºÆ®¼­ºñ½º // À§Ã³·³ Çϸé.. TestService¶ó´Â À̸§À¸·Î testservice.exe¸¦ µî·ÏÇϰí // ¼­ºñ½º °ü¸®ÀÚ¿¡¼­´Â 'Å×½ºÆ®¼­ºñ½º'·Î º¸ÀÔ´Ï´Ù. ÁÖÀÇ) ¿É¼Ç°ú ÆÄ¶ó¹ÌÅÍ »çÀÌ´Â ÇÑÄ­¾¿ ¶ç¿ö¾ßÇÕ´Ï´Ù~ < ¼­ºñ½º »èÁ¦ > ex) sc delete TestService < ¼­ºñ½º ½ÇÇàÇÏ´Â ¹ý > Á¦¾îÆÇ - °ü¸®µµ±¸ - ¼­ºñ½º °ü¸®ÀÚ?¸¦ ¶ç¿ö¼­ µî·ÏÇÑ ¼­ºñ½º À̸§À¸·Î ½ÃÀÛ-Á¤Áö µîÀ» ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¼Ó¼º¿¡¼­ º¹±¸ ÅÇÀ» ¼±ÅÃÇϸé ÁßÁöµÇ¾úÀ»¶§ÀÇ Ã³¸®¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. (!) ½ÃÀ۸Ű³º¯¼öµµ ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. --> WinMainÀ¸·Î °¡´Â°Ô ¾Æ´Ï¶ó ServiceMain(OnInit)À¸·Î °©´Ï´Ù. ·Î±×¿Â ÅÇ¿¡¼­ '¼­ºñ½º¿Í µ¥½ºÅ©Åé »óÈ£ ÀÛ¿ë Çã¿ë'À» ÄѸé ÄܼÖÀÌ º¸ÀÔ´Ï´Ù. --> ±âº» ¿É¼ÇÀ¸·Î Ãß°¡Çß½À´Ï´Ù. < ¼­ºñ½º µð¹ö±ë ÇÏ´Â ¹æ¹ý > À§ ¹æ¹ýó·³ ¼­ºñ½º¸¦ µî·ÏÇÏ°í ¼­ºñ½º °ü¸®ÀÚ¿¡¼­ µî·ÏÇÑ ¼­ºñ½ºÀÇ ¼Ó¼ºÀ» ¿­¾î¼­ ·Î±×¿Â ÅÇ¿¡¼­ '¼­ºñ½º¿Í µ¥½ºÅ©Åé »óÈ£ ÀÛ¿ë Çã¿ë'À» ÄÕ´Ï´Ù. ±×¸®°í, regedit¸¦ ½ÇÇà½ÃÄÑ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<µî·ÏÇѼ­ºñ½ºÀ̸§> ¿¡ °¡º¸¸é ImagePath¿¡ ½ÇÇàÈ­ÀÏÀÌ ¼³Á¤µÇ¾î ÀÖ½À´Ï´Ù. ½ÇÇàÈ­ÀÏ ´ë½Å¿¡ visual studio¸¦ ½ÇÇà½ÃÄѼ­ µð¹ö±ë ¸ðµå·Î ½ÇÇàÇÏ°Ô ÇÒ ¼ö ÀÖ½À´Ï´Ù. "C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\devenv.exe" d:\project\testservice.exe /debugexe ÀÌÁ¦ ¼­ºñ½º¸¦ ½ÃÀÛÇϸé vs°¡ ½ÇÇàµÇ°í µð¹ö±× »óÅ·Π½ÇÇàÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù. µð¹ö±ë Áß¿¡ 'µð¹ö±× - ¸ðµÎ Áß´Ü'À» ´©¸£¸é ¾îµð¼±°¡ ¸ØÃß°ÚÁÒ~ < »ùÇà ¼­ºñ½º ÄÚµå > class TestServiceApp : public ServiceApp { public : TestServiceApp(const char* pServiceName) : ServiceApp(pServiceName) { } virtual ~TestServiceApp() { } virtual VOID Update() { while (1) { // 0.5ÃÊ¿¡ Çѹø¾¿ .À» Âï½À´Ï´Ù. --> ¼­ºñ½º´Â ÄܼÖÀÌ ¾øÀ¸¹Ç·Î µð¹ö±ë ¸ðµå¿¡¼­¸¸ º¸ÀÔ´Ï´Ù. printf("."); Sleep(500); } } }; __DECLARE_SERVICE( TestServiceApp, "TestService" ); void main( ) { __START_SERVICE( TestServiceApp ); } < ¿¹Á¦ ¼­ºñ½º »ý¼º > D:\Sun\Server\_bin>sc create AgentServer binPath= d:\sun\server\_bin\AgentServer_d.exe DisplayName= "½ãAgent" [SC] CreateService ¼º°ø D:\Sun\Server\_bin>sc create DBProxyServer binPath= d:\sun\server\_bin\DatabaseProxy_d.exe DisplayName= "½ãDBProxy" [SC] CreateService ¼º°ø D:\Sun\Server\_bin>sc create GameServer binPath= d:\sun\server\_bin\GameServer_d.exe DisplayName= "½ãGame" [SC] CreateService ¼º°ø */ enum SERVER_MODE { eCONSOLE_MODE = 0, eSERVICE_MODE, }; class ServiceApp { public : ServiceApp(const char* pServiceName); virtual ~ServiceApp(); VOID StartService(LPSERVICE_MAIN_FUNCTION func, LPHANDLER_FUNCTION pCtrlHandler); VOID HandleStart (DWORD argc, LPTSTR *argv); VOID HandleControl (DWORD opcode); VOID SetServiceName( const char* pszServiceName ); virtual VOID Update() = 0; protected : virtual DWORD OnInit (DWORD argc, LPTSTR *argv, DWORD *specificError) { argc; argv; specificError; return 0; } virtual VOID OnPause() {} virtual VOID OnContinue() {} virtual VOID OnStop() {} virtual VOID OnInterrogate() {} virtual VOID OnShutDown() {} public : VOID DebugOut(LPSTR String, DWORD Status); static VOID SetApplicationDirectory(); // ÇÁ·Î±×·¥ ½ÇÇà °æ·Î·Î ¼³Á¤ protected : char m_ServiceName[256]; SERVICE_STATUS m_ServiceStatus; SERVICE_STATUS_HANDLE m_ServiceStatusHandle; LPHANDLER_FUNCTION m_pServiceCtrlHandler; }; #define __DECLARE_SERVICE( serviceClassName, serviceName ) \ \ serviceClassName g_##serviceClassName( serviceName ); \ \ VOID Start##serviceClassName##Function (DWORD argc, LPTSTR *argv) { g_##serviceClassName.HandleStart(argc, argv); } \ VOID Control##serviceClassName##Function (DWORD opcode) { g_##serviceClassName.HandleControl(opcode); } #define __START_SERVICE( serviceClassName ) \ g_##serviceClassName.StartService( (LPSERVICE_MAIN_FUNCTION)Start##serviceClassName##Function, (LPHANDLER_FUNCTION)Control##serviceClassName##Function ); #endif // __SERVICE_APP_H__