c++实现windows服务程序实例

来源:互联网 发布:软件测试行业学费 编辑:程序博客网 时间:2024/05/17 09:14

1、注册服务 :在 "开始->运行->cmd" 中输入 sc create TEST binPath = "C:\TEST.EXE" 则在windows下注册了一项服务

sc create TestService binpath= "c:\ServiceTest.exe" displayname= "TestService" depend= Tcpip start=    auto 

注意这里的格式,“=”后面是必须空一格的,否则会出现错误。        
在提示建立成功后,可以直接输入“net start TestService” 
来启动服务,或者可以直接在“管理工具”的“服务”中直接启动。 
C:\Documents and Settings\Administrator>sc create 
描述: 
        在注册表和服务数据库中创建服务项。 
用法: 
sc <server> create [service name] [binPath= ] <option1> <option2>...

 

2、启停服务 :在 "开始->运行->cmd" 中输入"Service.msc"查看该服务状态及开启、停止服务

3、删除服务 :在 "开始->运行->cmd" 中输入 sc delete TEST

以下是C++语言的一个服务程序编写的实例,编译生成 “C:\ServiceTest.exe“



[cpp] view plaincopyprint?
  1. // ServiceTest.cpp : Defines the entry point for the application.  
  2. //   
  3.   
  4. #include "stdafx.h"   
  5. #include "stdio.h"   
  6. #include "tchar.h"   
  7.   
  8. #include<iostream>   
  9. using namespace std;  
  10. //定义全局函数变量   
  11. void Init();  
  12. BOOL IsInstalled();  
  13. BOOL Install();  
  14. BOOL Uninstall();  
  15. void LogEvent(LPCTSTR pszFormat, ...);  
  16. void WINAPI ServiceMain();  
  17. void WINAPI ServiceStrl(DWORD dwOpcode);  
  18.   
  19. TCHAR szServiceName[] = _T("ServiceTest");  
  20. BOOL bInstall;  
  21. SERVICE_STATUS_HANDLE hServiceStatus;  
  22. SERVICE_STATUS status;  
  23. DWORD dwThreadID;  
  24.   
  25. int APIENTRY WinMain(HINSTANCE hInstance,  
  26.                      HINSTANCE hPrevInstance,  
  27.                      LPSTR     lpCmdLine,  
  28.                      int       nCmdShow)  
  29. {  
  30.     Init();  
  31.       
  32.     dwThreadID = ::GetCurrentThreadId();  
  33.   
  34.     SERVICE_TABLE_ENTRY st[] =  
  35.     {  
  36.         { szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },  
  37.         { NULL, NULL }  
  38.     };  
  39.   
  40.     if (stricmp(lpCmdLine, "/install") == 0)  
  41.     {  
  42.         Install();  
  43.     }  
  44.     else if (stricmp(lpCmdLine, "/uninstall") == 0)  
  45.     {  
  46.         Uninstall();  
  47.     }  
  48.     else  
  49.     {  
  50.         if (!::StartServiceCtrlDispatcher(st))  
  51.         {  
  52.             LogEvent(_T("Register Service Main Function Error!"));  
  53.         }  
  54.     }  
  55.   
  56.     return 0;  
  57. }  
  58. //*********************************************************  
  59. //Functiopn:            Init   
  60. //Description:            初始化   
  61. //Calls:                main   
  62. //Called By:                   
  63. //Table Accessed:                  
  64. //Table Updated:                   
  65. //Input:                   
  66. //Output:                   
  67. //Return:                   
  68. //Others:                   
  69. //History:                   
  70. //            <author>niying <time>2006-8-10        <version>        <desc>  
  71. //*********************************************************  
  72. void Init()  
  73. {  
  74.     hServiceStatus = NULL;  
  75.     status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;  
  76.     status.dwCurrentState = SERVICE_STOPPED;  
  77.     status.dwControlsAccepted = SERVICE_ACCEPT_STOP;  
  78.     status.dwWin32ExitCode = 0;  
  79.     status.dwServiceSpecificExitCode = 0;  
  80.     status.dwCheckPoint = 0;  
  81.     status.dwWaitHint = 0;  
  82. }  
  83.   
  84. //*********************************************************  
  85. //Functiopn:            ServiceMain  
  86. //Description:            服务主函数,这在里进行控制对服务控制的注册  
  87. //Calls:   
  88. //Called By:   
  89. //Table Accessed:   
  90. //Table Updated:   
  91. //Input:   
  92. //Output:   
  93. //Return:   
  94. //Others:   
  95. //History:   
  96. //            <author>niying <time>2006-8-10        <version>        <desc>  
  97. //*********************************************************  
  98. void WINAPI ServiceMain()  
  99. {  
  100.     // Register the control request handler  
  101.     status.dwCurrentState = SERVICE_START_PENDING;  
  102.     status.dwControlsAccepted = SERVICE_ACCEPT_STOP;  
  103.   
  104.     //注册服务控制   
  105.     hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl);  
  106.     if (hServiceStatus == NULL)  
  107.     {  
  108.         LogEvent(_T("Handler not installed"));  
  109.         return;  
  110.     }  
  111.     SetServiceStatus(hServiceStatus, &status);  
  112.   
  113.     status.dwWin32ExitCode = S_OK;  
  114.     status.dwCheckPoint = 0;  
  115.     status.dwWaitHint = 0;  
  116.     status.dwCurrentState = SERVICE_RUNNING;  
  117.     SetServiceStatus(hServiceStatus, &status);  
  118.   
  119.     //模拟服务的运行,10后自动退出。应用时将主要任务放于此即可  
  120.     int i = 0;  
  121.     while (i < 10)  
  122.     {  
  123.         //新建文件   
  124.         FILE * fp0=fopen("c:/tt.txt","a");  
  125.         fclose(fp0);  
  126.         Sleep(10000);  
  127.         i++;  
  128.     }  
  129.     //   
  130.   
  131.     status.dwCurrentState = SERVICE_STOPPED;  
  132.     SetServiceStatus(hServiceStatus, &status);  
  133.     LogEvent(_T("Service stopped"));  
  134. }  
  135.   
  136. //*********************************************************  
  137. //Functiopn:            ServiceStrl  
  138. //Description:            服务控制主函数,这里实现对服务的控制,  
  139. //                        当在服务管理器上停止或其它操作时,将会运行此处代码  
  140. //Calls:   
  141. //Called By:   
  142. //Table Accessed:   
  143. //Table Updated:   
  144. //Input:                dwOpcode:控制服务的状态   
  145. //Output:   
  146. //Return:   
  147. //Others:   
  148. //History:   
  149. //            <author>niying <time>2006-8-10        <version>        <desc>  
  150. //*********************************************************  
  151. void WINAPI ServiceStrl(DWORD dwOpcode)  
  152. {  
  153.     switch (dwOpcode)  
  154.     {  
  155.     case SERVICE_CONTROL_STOP:  
  156.         status.dwCurrentState = SERVICE_STOP_PENDING;  
  157.         SetServiceStatus(hServiceStatus, &status);  
  158.         PostThreadMessage(dwThreadID, WM_CLOSE, 0, 0);  
  159.         break;  
  160.     case SERVICE_CONTROL_PAUSE:  
  161.         break;  
  162.     case SERVICE_CONTROL_CONTINUE:  
  163.         break;  
  164.     case SERVICE_CONTROL_INTERROGATE:  
  165.         break;  
  166.     case SERVICE_CONTROL_SHUTDOWN:  
  167.         break;  
  168.     default:  
  169.         LogEvent(_T("Bad service request"));  
  170.     }  
  171. }  
  172. //*********************************************************  
  173. //Functiopn:            IsInstalled  
  174. //Description:            判断服务是否已经被安装   
  175. //Calls:   
  176. //Called By:   
  177. //Table Accessed:   
  178. //Table Updated:   
  179. //Input:   
  180. //Output:   
  181. //Return:   
  182. //Others:   
  183. //History:   
  184. //            <author>niying <time>2006-8-10        <version>        <desc>  
  185. //*********************************************************  
  186. BOOL IsInstalled()  
  187. {  
  188.     BOOL bResult = FALSE;  
  189.   
  190.     //打开服务控制管理器   
  191.     SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);  
  192.   
  193.     if (hSCM != NULL)  
  194.     {  
  195.         //打开服务   
  196.         SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_QUERY_CONFIG);  
  197.         if (hService != NULL)  
  198.         {  
  199.             bResult = TRUE;  
  200.             ::CloseServiceHandle(hService);  
  201.         }  
  202.         ::CloseServiceHandle(hSCM);  
  203.     }  
  204.     return bResult;  
  205. }  
  206.   
  207. //*********************************************************  
  208. //Functiopn:            Install   
  209. //Description:            安装服务函数  
  210. //Calls:   
  211. //Called By:   
  212. //Table Accessed:   
  213. //Table Updated:   
  214. //Input:   
  215. //Output:   
  216. //Return:   
  217. //Others:   
  218. //History:   
  219. //            <author>niying <time>2006-8-10        <version>        <desc>  
  220. //*********************************************************  
  221. BOOL Install()  
  222. {  
  223.     if (IsInstalled())  
  224.         return TRUE;  
  225.   
  226.     //打开服务控制管理器   
  227.     SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);  
  228.     if (hSCM == NULL)  
  229.     {  
  230.         MessageBox(NULL, _T("Couldn't open service manager"), szServiceName, MB_OK);  
  231.         return FALSE;  
  232.     }  
  233.   
  234.     // Get the executable file path   
  235.     TCHAR szFilePath[MAX_PATH];  
  236.     ::GetModuleFileName(NULL, szFilePath, MAX_PATH);  
  237.   
  238.     //创建服务   
  239.     SC_HANDLE hService = ::CreateService(  
  240.         hSCM, szServiceName, szServiceName,  
  241.         SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,  
  242.         SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,  
  243.         szFilePath, NULL, NULL, _T(""), NULL, NULL);  
  244.   
  245.     if (hService == NULL)  
  246.     {  
  247.         ::CloseServiceHandle(hSCM);  
  248.         MessageBox(NULL, _T("Couldn't create service"), szServiceName, MB_OK);  
  249.         return FALSE;  
  250.     }  
  251.   
  252.     ::CloseServiceHandle(hService);  
  253.     ::CloseServiceHandle(hSCM);  
  254.     return TRUE;  
  255. }  
  256.   
  257. //*********************************************************  
  258. //Functiopn:            Uninstall   
  259. //Description:            删除服务函数  
  260. //Calls:   
  261. //Called By:   
  262. //Table Accessed:   
  263. //Table Updated:   
  264. //Input:   
  265. //Output:   
  266. //Return:   
  267. //Others:   
  268. //History:   
  269. //            <author>niying <time>2006-8-10        <version>        <desc>  
  270. //*********************************************************  
  271. BOOL Uninstall()  
  272. {  
  273.     if (!IsInstalled())  
  274.         return TRUE;  
  275.   
  276.     SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);  
  277.   
  278.     if (hSCM == NULL)  
  279.     {  
  280.         MessageBox(NULL, _T("Couldn't open service manager"), szServiceName, MB_OK);  
  281.         return FALSE;  
  282.     }  
  283.   
  284.     SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_STOP | DELETE);  
  285.   
  286.     if (hService == NULL)  
  287.     {  
  288.         ::CloseServiceHandle(hSCM);  
  289.         MessageBox(NULL, _T("Couldn't open service"), szServiceName, MB_OK);  
  290.         return FALSE;  
  291.     }  
  292.     SERVICE_STATUS status;  
  293.     ::ControlService(hService, SERVICE_CONTROL_STOP, &status);  
  294.   
  295.     //删除服务   
  296.     BOOL bDelete = ::DeleteService(hService);  
  297.     ::CloseServiceHandle(hService);  
  298.     ::CloseServiceHandle(hSCM);  
  299.   
  300.     if (bDelete)  
  301.         return TRUE;  
  302.   
  303.     LogEvent(_T("Service could not be deleted"));  
  304.     return FALSE;  
  305. }  
  306.   
  307. //*********************************************************  
  308. //Functiopn:            LogEvent   
  309. //Description:            记录服务事件  
  310. //Calls:   
  311. //Called By:   
  312. //Table Accessed:   
  313. //Table Updated:   
  314. //Input:   
  315. //Output:   
  316. //Return:   
  317. //Others:   
  318. //History:   
  319. //            <author>niying <time>2006-8-10        <version>        <desc>  
  320. //*********************************************************  
  321. void LogEvent(LPCTSTR pFormat, ...)  
  322. {  
  323.     TCHAR    chMsg[256];  
  324.     HANDLE  hEventSource;  
  325.     LPTSTR  lpszStrings[1];  
  326.     va_list pArg;  
  327.   
  328.     va_start(pArg, pFormat);  
  329.     _vstprintf(chMsg, pFormat, pArg);  
  330.     va_end(pArg);  
  331.   
  332.     lpszStrings[0] = chMsg;  
  333.       
  334.     hEventSource = RegisterEventSource(NULL, szServiceName);  
  335.     if (hEventSource != NULL)  
  336.     {  
  337.         ReportEvent(hEventSource, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (LPCTSTR*) &lpszStrings[0], NULL);  
  338.         DeregisterEventSource(hEventSource);  
  339.     }  

0 0