在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 "服务描述" //添加服务描述

#include <windows.h>

CHAR SrvName[] = "SrvDemo";
SERVICE_STATUS g_hStatusService;
SERVICE_STATUS_HANDLE g_hStatusHandle; VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv);
VOID WINAPI ServiceHandler(DWORD fdwControl); DWORD DoInitialize(DWORD dwArgc, LPTSTR *lpszArgv);
VOID DoWork(DWORD dwArgc, LPTSTR *lpszArgv); int main(int argc, char** argv)
{
SERVICE_TABLE_ENTRY ServiceTable[2];
ServiceTable[0].lpServiceName = SrvName;
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
ServiceTable[1].lpServiceName = NULL;
ServiceTable[1].lpServiceProc = NULL; StartServiceCtrlDispatcher(ServiceTable); return 0;
} //服务控制处理函数
VOID WINAPI ServiceHandler(DWORD fdwControl)
{
switch (fdwControl)
{
case SERVICE_CONTROL_PAUSE:
g_hStatusService.dwCurrentState = SERVICE_PAUSED;
break; case SERVICE_CONTROL_CONTINUE:
g_hStatusService.dwCurrentState = SERVICE_RUNNING;
break; case SERVICE_CONTROL_STOP:
case SERVICE_CONTROL_SHUTDOWN:
g_hStatusService.dwCurrentState = SERVICE_STOPPED;
g_hStatusService.dwWin32ExitCode = 0;
g_hStatusService.dwCheckPoint = 0;
g_hStatusService.dwWaitHint = 0;
SetServiceStatus(g_hStatusHandle, &g_hStatusService);
return; case SERVICE_CONTROL_INTERROGATE:
break; default:
break;
} SetServiceStatus(g_hStatusHandle, &g_hStatusService);
return;
} //服务主函数
VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
{
g_hStatusHandle = RegisterServiceCtrlHandler(SrvName,
(LPHANDLER_FUNCTION)ServiceHandler);
if (g_hStatusHandle == NULL)
return; // 设置一些参数
g_hStatusService.dwServiceType = SERVICE_WIN32;
g_hStatusService.dwCurrentState = SERVICE_START_PENDING;
g_hStatusService.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE;
g_hStatusService.dwWin32ExitCode = 0;
g_hStatusService.dwServiceSpecificExitCode = 0;
g_hStatusService.dwCheckPoint = 0;
g_hStatusService.dwWaitHint = 0;
SetServiceStatus(g_hStatusHandle, &g_hStatusService); // 初始化操作
DWORD dwRet = DoInitialize(dwArgc, lpszArgv);
if (dwRet != NO_ERROR)
{
g_hStatusService.dwCurrentState = SERVICE_STOPPED;
g_hStatusService.dwWin32ExitCode = dwRet;
SetServiceStatus(g_hStatusHandle, &g_hStatusService);
return;
} // 初始化结束,报告运行状态
g_hStatusService.dwCurrentState = SERVICE_RUNNING;
g_hStatusService.dwCheckPoint = 0;
g_hStatusService.dwWaitHint = 0;
SetServiceStatus(g_hStatusHandle, &g_hStatusService); //在这里做其他的工作
DoWork(dwArgc, lpszArgv);
} // 执行一些初始化过程
DWORD DoInitialize(DWORD dwArgc, LPTSTR *lpszArgv)
{
return NO_ERROR;
} VOID DoWork(DWORD dwArgc, LPTSTR *lpszArgv)
{
// lpszArgv[1]是参数1
if (dwArgc == 1)
{
return;
}
else if (dwArgc == 2)
{
srvlog("lpszArgv[1]: %s\n", lpszArgv[1]);
return;
}
else if (dwArgc == 3)
{
}
}

  

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. Shell脚本例子集合

    # vi xx.sh 退出并保存 # chmod +x xx.sh # ./xx.sh -2. 调试脚本的方法 # bash -x xx.sh 就可以调试了 . -1. 配置 secureCRT 的设 ...

  2. 沉淀再出发:ELK使用初探

    沉淀再出发:ELK使用初探 一.前言 ELK是Elasticsearch.Logstash.Kibana的简称,这三者是核心套件,但并非全部. 最近ElasticSearch可以说是非常火的一款开源软 ...

  3. ZT C/C++变量命名规则,个人习惯总结

    C/C++变量命名规则,个人习惯总结 (2012-10-31 13:48:10) 转载▼ 标签: c/c变量命名规则 c语言变量命名 c变量命名 规则规范 it 分类: C/VC C_C++变量命名规 ...

  4. 【RabbitMQ】4、三种Exchange模式——订阅、路由、通配符模式

    前两篇博客介绍了两种队列模式,这篇博客介绍订阅.路由和通配符模式,之所以放在一起介绍,是因为这三种模式都是用了Exchange交换机,消息没有直接发送到队列,而是发送到了交换机,经过队列绑定交换机到达 ...

  5. python 中logging的日志封装

    因为最近在做平台,发现有同事,使用django封装了日志模块,看样子很简单,准备自己单独做了一个日志封装模板,对于python不熟练的我,封装部分参考了多个博主的内容,形成自己的日志模块,内容如下: ...

  6. POJ3690 Constellations

    嘟嘟嘟 哈希 刚开始我一直在想二维哈希,但发现如果还是按行列枚举的话会破坏子矩阵的性质.也就是说,这个哈希只能维护一维的子区间的哈希值. 所以我就开了个二维数组\(has_{i, j}\)表示原矩阵\ ...

  7. vector详讲(三)实例

    移动语义: push语句有时候会通过移动语义来提高性能 #include <iostream> #include <vector> class Element { public ...

  8. PAT——1050. 螺旋矩阵

    本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”.所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条件:m*n等于N:m>=n:且m- ...

  9. sharepoint 搜索报错

    配置sharepoint 拓扑架构,将两台服务器一起来爬网. 配置如下: $hostA = Get-SPEnterpriseSearchServiceInstance -Identity " ...

  10. 分享cropper剪切单张图片demo

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...