C++编写及注册windows服务程序

2023-11-06

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“



  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.     }  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++编写及注册windows服务程序 的相关文章

随机推荐

  • 神武跑环遇到服务器维护,神武跑环不再痛苦:任务链重点难点详解攻略

    神武跑环不再痛苦 任务链重点难点详解攻略 大家快来看看吧 神武跑环不再痛苦 任务链重点难点详解攻略 相关新闻 任务链攻略 任务内容包括 找人 找到NPC对话即可 无时限 击败NPC 击败指定NPC即可 40分钟 难度较高 寻找物品交予NPC
  • kali功能介绍及安装(超详细)

    kali功能介绍及安装 超详细 一 kali简介 1 描述 Kali Linux是一个操作系统 2013 03 13诞生 基于Debian Linux的发行版 基于包含了约600个安全工具 省去了繁琐的安装 编译 配置 更新步骤 为所有工具
  • Python字符串中的特殊字符

    f 字符串 格式化字符串 在字符串前面加上 f 可以创建一个格式化字符串 在其中可以使用花括号 来插入变量或表达式的值 这种字符串会在运行时进行格式化处理 例如 name Alice age 25 print f My name is na
  • js实现图片懒加载原理

    有时候一个网页会包含很多的图片 例如淘宝京东这些购物网站 商品图片多只之又多 页面图片多 加载的图片就多 服务器压力就会很大 不仅影响渲染速度还会浪费带宽 比如一个1M大小的图片 并发情况下 达到1000并发 即同时有1000个人访问 就会
  • 学习记录Linux搭建nginx

    安装编译工具及库文件 yum y install make zlib zlib devel gcc c libtool openssl openssl devel 首先要安装 PCRE 下载 PCRE 安装包 下载地址 http downl
  • Pycharm常用快捷键大全

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net momoda118 article details 120155611 工欲善其事必先
  • 如何将任意大小的图片填充成一个方形

    这种方式我认为是最适合的图片预处理方式 随意resize会改变图片的特征 而进行填充的方式除了会改变原来标签的坐标以外 可以完全保留图片上所有的物体最原始的特征 def pad to square img pad value c h w i
  • 用Gerrit commit时报错missing Change-Id in message footer

    本人在第一次使用Gerrit时提交代码一直报change Id找不到 在git log的时候显示如下 查询其他文档发现是commit msg文件不存在导致的 现给出解决方案 提示错误 错误信息如下 remote Resolving delt
  • ctfshow终极考核wp

    文章目录 web640 web641 web642 web643 web644 web645 web646 web647 web648 web649 web650 web651 web652 web653 web654 web640 打开页
  • 【华为OD机试】支持优先级的队列【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 实现一个支持优先级的队列 高优先级先出队列 同优先级时先进先出 如果两个输入数据和优先级都相同 则后一个数据不入队列被丢弃 队列存储的数据内容是一个整数 输入描述 一
  • 修改 Linux VM 中单个用户最大进程数的限制

    在部署有并发任务执行的虚机上 会遇到 SSH 无法访问的问题 本文将帮助你找出其中一种比较特殊的原因 并提供解决方案 Note 以下案例分析基于 CentOS 7 对于其他版本的 Linux 操作系统 会略有不同 请注意 症状描述 虚机在正
  • BaoStock:一个免费、开源的python证券数据接口包

    如果需要获取历史行情数据 www baostock com是个很好的免费 开源的Python证券数据接口包 特点 使用方便 免费免费免费 返回的绝大部分的数据格式都是pandas DataFrame类型 入门代码如下 import baos
  • 分布式系统常用的模式

    分布式系统常用的模式 Ambassador 名称 大使 模式 介绍 作为应用程序和其他服务的 中间人 负责应用程序和其他服务之间的通信 包括日志 监控或重试处理等任务 举例 K8S使用Envoy作为一个 大使 来简化服务之间的通信 优点 降
  • MySQL多表查询

    目录 一 查询和新增结合 二 聚合查询 1 聚合函数 2 group by子句 三 联合查询 1 笛卡尔积 1 内连接 2 外连接 1 左外连接 2 右外连接 3 自连接 4 子查询 嵌套查询 5 合并查询 一 查询和新增结合 将表2中的数
  • 第十二届蓝桥杯省赛第二场C/C++大学B组编程题题目及解析

    目录 试题F 特殊年份 试题G 小平方 试题H 完全平方数 试题I 负载平衡 试题J 国际象棋 试题F 特殊年份 include
  • 【Linux】设计模式

    目录 1设计模式 1 1概念 1 2设计模式分类 1 3单例模式 1 4单例模式代码演示 1 4 1懒汉模式 1 4 2饿汉模式 2 读写锁 2 1概念 2 2加锁规则 2 3接口 2 3 1初始化接口 2 3 2销毁接口 2 3 3解锁接
  • 第1章第5节:如何使用模板创建风格统一的幻灯片 [PowerPoint精美幻灯片实战教程]

    使用模板可以创建美观 风格统一和专业的幻灯片 要使用模板创建幻灯片 首先点击此处的文件选项卡 进入文件功能页面 然后在左侧的命令列表中 点击新建命令 在页面的下方 是由微软提供的常见的演示文稿模板 也可以通过搜索框 搜索指定主题的模板 点击
  • SharedPreferences 操作

    public class SPActivity extends Activity 使用SharedPreferences 来储存与读取数据 SharedPreferences mShared null 程序中可以同时存在多个SharedPr
  • IndentationError:expected an indented block错误解决

    IndentationError expected an indented block错误解决 描述 有时一个简单的问题会困扰很久 当发现问题后才感觉自己是多蠢 下面记录一个在日常Python编程过程中碰见的典型问题 参考文章 http h
  • C++编写及注册windows服务程序

    1 注册服务 在 开始 gt 运行 gt cmd 中输入 sc create TEST binPath C TEST EXE 则在windows下注册了一项服务 sc create TestService binpath c Service