在DoWork中添加自己的代码。
 
服务安装: sc create srvdemo binpath= "F:\srvdemo.exe"
服务启动:sc start srvdemo 参数1 参数2    //net start方式不支持参数
服务停止:sc/net stop srvdemo
服务删除:sc delete srvdemo
 
其他命令:sc description srvdemo "服务描述" //添加服务描述

  1. #include <windows.h>
  2.  
  3. CHAR SrvName[] = "SrvDemo";
  4. SERVICE_STATUS g_hStatusService;
  5. SERVICE_STATUS_HANDLE g_hStatusHandle;
  6.  
  7. VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv);
  8. VOID WINAPI ServiceHandler(DWORD fdwControl);
  9.  
  10. DWORD DoInitialize(DWORD dwArgc, LPTSTR *lpszArgv);
  11. VOID DoWork(DWORD dwArgc, LPTSTR *lpszArgv);
  12.  
  13. int main(int argc, char** argv)
  14. {
  15. SERVICE_TABLE_ENTRY ServiceTable[2];
  16. ServiceTable[0].lpServiceName = SrvName;
  17. ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
  18. ServiceTable[1].lpServiceName = NULL;
  19. ServiceTable[1].lpServiceProc = NULL;
  20.  
  21. StartServiceCtrlDispatcher(ServiceTable);
  22.  
  23. return 0;
  24. }
  25.  
  26. //服务控制处理函数
  27. VOID WINAPI ServiceHandler(DWORD fdwControl)
  28. {
  29. switch (fdwControl)
  30. {
  31. case SERVICE_CONTROL_PAUSE:
  32. g_hStatusService.dwCurrentState = SERVICE_PAUSED;
  33. break;
  34.  
  35. case SERVICE_CONTROL_CONTINUE:
  36. g_hStatusService.dwCurrentState = SERVICE_RUNNING;
  37. break;
  38.  
  39. case SERVICE_CONTROL_STOP:
  40. case SERVICE_CONTROL_SHUTDOWN:
  41. g_hStatusService.dwCurrentState = SERVICE_STOPPED;
  42. g_hStatusService.dwWin32ExitCode = 0;
  43. g_hStatusService.dwCheckPoint = 0;
  44. g_hStatusService.dwWaitHint = 0;
  45. SetServiceStatus(g_hStatusHandle, &g_hStatusService);
  46. return;
  47.  
  48. case SERVICE_CONTROL_INTERROGATE:
  49. break;
  50.  
  51. default:
  52. break;
  53. }
  54.  
  55. SetServiceStatus(g_hStatusHandle, &g_hStatusService);
  56. return;
  57. }
  58.  
  59. //服务主函数
  60. VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
  61. {
  62. g_hStatusHandle = RegisterServiceCtrlHandler(SrvName,
  63. (LPHANDLER_FUNCTION)ServiceHandler);
  64. if (g_hStatusHandle == NULL)
  65. return;
  66.  
  67. // 设置一些参数
  68. g_hStatusService.dwServiceType = SERVICE_WIN32;
  69. g_hStatusService.dwCurrentState = SERVICE_START_PENDING;
  70. g_hStatusService.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE;
  71. g_hStatusService.dwWin32ExitCode = 0;
  72. g_hStatusService.dwServiceSpecificExitCode = 0;
  73. g_hStatusService.dwCheckPoint = 0;
  74. g_hStatusService.dwWaitHint = 0;
  75. SetServiceStatus(g_hStatusHandle, &g_hStatusService);
  76.  
  77. // 初始化操作
  78. DWORD dwRet = DoInitialize(dwArgc, lpszArgv);
  79. if (dwRet != NO_ERROR)
  80. {
  81. g_hStatusService.dwCurrentState = SERVICE_STOPPED;
  82. g_hStatusService.dwWin32ExitCode = dwRet;
  83. SetServiceStatus(g_hStatusHandle, &g_hStatusService);
  84. return;
  85. }
  86.  
  87. // 初始化结束,报告运行状态
  88. g_hStatusService.dwCurrentState = SERVICE_RUNNING;
  89. g_hStatusService.dwCheckPoint = 0;
  90. g_hStatusService.dwWaitHint = 0;
  91. SetServiceStatus(g_hStatusHandle, &g_hStatusService);
  92.  
  93. //在这里做其他的工作
  94. DoWork(dwArgc, lpszArgv);
  95. }
  96.  
  97. // 执行一些初始化过程
  98. DWORD DoInitialize(DWORD dwArgc, LPTSTR *lpszArgv)
  99. {
  100. return NO_ERROR;
  101. }
  102.  
  103. VOID DoWork(DWORD dwArgc, LPTSTR *lpszArgv)
  104. {
  105. // lpszArgv[1]是参数1
  106. if (dwArgc == 1)
  107. {
  108. return;
  109. }
  110. else if (dwArgc == 2)
  111. {
  112. srvlog("lpszArgv[1]: %s\n", lpszArgv[1]);
  113. return;
  114. }
  115. else if (dwArgc == 3)
  116. {
  117. }
  118. }

  

C服务程序模板的更多相关文章

  1. java模板和回调机制学习总结

    最近看spring的JDBCTemplete的模板方式调用时,对模板和回调产生了浓厚兴趣,查询了一些资料,做一些总结. 回调函数: 所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个 ...

  2. .net Windows服务程序和安装程序制作图解 及 VS 2010创建、安装、调试 windows服务(windows service)

    .net Windows服务程序和安装程序制作 最近项目中用到window服务程序,以前没接触过,比较陌生,花了两天的时间学习了下,写了个简单的服务,但在制作安装程序的时候,参照网上很多资料,却都制作 ...

  3. .net Windows服务程序和安装程序制作图解

    最近项目中用到window服务程序,以前没接触过,比较陌生,花了两天的时间学习了下,写了个简单的服务,但在制作安装程序的时候,参照网上很多资料,却都制作不成功,可能是开发环境或项目配置的不同,这里把自 ...

  4. 服务程序在c#中的写法

    1.在VS.NET2003中新建一个WINDOWS服务程序的项目WinSrv_A. 2.更改SERVICE1.CS属性SERVICENAME为你所要建立的服务名称,在服务管理器->名称中你可以看 ...

  5. Cookiecutter: 更好的项目模板工具:(1)简介及可用资源汇总

    原文档地址:https://cookiecutter.readthedocs.io/en/latest/ 本系列只介绍cookiecutter的基础使用,而且会删除与功能使用无关的部分.深度使用及了解 ...

  6. java程序在windows系统作为服务程序运行

    Java程序很多情况下是作为服务程序运行的,在Un*x 平台下可以利用在命令后加“&”把程序作为后台服务运行,但在Windows下看作那个Console窗口在桌面上,你是否一直担心别的同时把你 ...

  7. .NET 跨平台RPC框架DotNettyRPC Web后台快速开发框架(.NET Core) EasyWcf------无需配置,无需引用,动态绑定,轻松使用 C# .NET 0配置使用Wcf(半成品) C# .NET Socket 简单实用框架 C# .NET 0命令行安装Windows服务程序

    .NET 跨平台RPC框架DotNettyRPC   DotNettyRPC 1.简介 DotNettyRPC是一个基于DotNetty的跨平台RPC框架,支持.NET45以及.NET Standar ...

  8. 多线程、方便扩展的Windows服务程序框架

    多线程.方便扩展的Windows服务程序框架 吴剑 2012-06-02 转载请注明出处:http://www.cnblogs.com/wu-jian/ 前言 在项目应用中经常会碰到定时调度的工作,比 ...

  9. 【RTOS】基于V7开发板的最新版uCOS-III V3.07.03程序模板,含MDK和IAR,支持uC/Probe,与之前版本变化较大

    模板下载: 链接:https://pan.baidu.com/s/1_4z_Lg51jMT87RrRM6Qs3g   提取码:2gns 对MDK的AC6也做了支持:https://www.cnblog ...

随机推荐

  1. dADas

    Linux(Centos)之安装Nginx及注意事项 - Kencery - 博客园   怪才(Kencery) 菜鸟的里程中只有奋斗,别无其他 博客园 首页 新随笔 联系 订阅 管理   Linux ...

  2. [日常]蒟蒻的高一生活 Week 1~3

    博主在三周前成功晋级为高中生OwO终于不再是假的HZOIer感受一波HZ的真正生活...(然而实际上级部不少监督一直没启动23333) (然而三周过去好多事情都忘了QAQ瞎写好了(逃)) Week 1 ...

  3. 自学PHP有哪些书籍和教程值得推荐?

    知乎上看到一题主询问:"自学PHP有哪些书籍和教程值得推荐?",互联网深度屌丝秦风给出了不错的答案,希望能够帮助自学PHP的朋友们. 以下仅供参考: 尤其不认可W3school之类 ...

  4. 可以在命令行直接使用密码来进行远程连接和远程拉取文件的命令:sshpass

      应用范围:可以在命令行直接使用密码来进行远程连接和远程拉取文件. 使用前提:对于未连接过的主机.而又不输入yes进行确认,需要进行sshd服务的优化: # vim /etc/ssh/ssh_con ...

  5. LVS.md

    LVS 概述 简介 LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,官方站点.现在LVS已经是 Linux标准内核的一部分, ...

  6. python不用正则过渡括号

  7. Ubuntu root 密码忘记-恢复

    @Ubuntu root 密码忘记-恢复 2012-04-27 11:09:22 方法一: 如果用户具有sudo权限,那么直接可以运行如下命令: #sudo su root #passwd #更改密码 ...

  8. BZOJ1499:[NOI2005]瑰丽华尔兹(DP,单调队列)

    Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是很少有几个人知道,世界上最伟大的钢琴家一生都漂泊在 ...

  9. gluoncv 训练自己的数据集,进行目标检测

    跑了一晚上的模型,实在占GPU资源,这两天已经有很多小朋友说我了.我选择了其中一个参数. https://github.com/dmlc/gluon-cv/blob/master/scripts/de ...

  10. 【[HNOI2012]矿场搭建】

    抄题解真开心 我真是越来越菜了 这是点双的板子题,于是求出所有点双,之后讨论 如果点双里之有一个割点,那么如果这个割点炸了,这个点双就出不去了,于是我们得在这个点双内部除了这个割点位置放一个 如果有两 ...