C服务程序模板
- #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服务程序模板的更多相关文章
- java模板和回调机制学习总结
最近看spring的JDBCTemplete的模板方式调用时,对模板和回调产生了浓厚兴趣,查询了一些资料,做一些总结. 回调函数: 所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个 ...
- .net Windows服务程序和安装程序制作图解 及 VS 2010创建、安装、调试 windows服务(windows service)
.net Windows服务程序和安装程序制作 最近项目中用到window服务程序,以前没接触过,比较陌生,花了两天的时间学习了下,写了个简单的服务,但在制作安装程序的时候,参照网上很多资料,却都制作 ...
- .net Windows服务程序和安装程序制作图解
最近项目中用到window服务程序,以前没接触过,比较陌生,花了两天的时间学习了下,写了个简单的服务,但在制作安装程序的时候,参照网上很多资料,却都制作不成功,可能是开发环境或项目配置的不同,这里把自 ...
- 服务程序在c#中的写法
1.在VS.NET2003中新建一个WINDOWS服务程序的项目WinSrv_A. 2.更改SERVICE1.CS属性SERVICENAME为你所要建立的服务名称,在服务管理器->名称中你可以看 ...
- Cookiecutter: 更好的项目模板工具:(1)简介及可用资源汇总
原文档地址:https://cookiecutter.readthedocs.io/en/latest/ 本系列只介绍cookiecutter的基础使用,而且会删除与功能使用无关的部分.深度使用及了解 ...
- java程序在windows系统作为服务程序运行
Java程序很多情况下是作为服务程序运行的,在Un*x 平台下可以利用在命令后加“&”把程序作为后台服务运行,但在Windows下看作那个Console窗口在桌面上,你是否一直担心别的同时把你 ...
- .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 ...
- 多线程、方便扩展的Windows服务程序框架
多线程.方便扩展的Windows服务程序框架 吴剑 2012-06-02 转载请注明出处:http://www.cnblogs.com/wu-jian/ 前言 在项目应用中经常会碰到定时调度的工作,比 ...
- 【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 ...
随机推荐
- dADas
Linux(Centos)之安装Nginx及注意事项 - Kencery - 博客园 怪才(Kencery) 菜鸟的里程中只有奋斗,别无其他 博客园 首页 新随笔 联系 订阅 管理 Linux ...
- [日常]蒟蒻的高一生活 Week 1~3
博主在三周前成功晋级为高中生OwO终于不再是假的HZOIer感受一波HZ的真正生活...(然而实际上级部不少监督一直没启动23333) (然而三周过去好多事情都忘了QAQ瞎写好了(逃)) Week 1 ...
- 自学PHP有哪些书籍和教程值得推荐?
知乎上看到一题主询问:"自学PHP有哪些书籍和教程值得推荐?",互联网深度屌丝秦风给出了不错的答案,希望能够帮助自学PHP的朋友们. 以下仅供参考: 尤其不认可W3school之类 ...
- 可以在命令行直接使用密码来进行远程连接和远程拉取文件的命令:sshpass
应用范围:可以在命令行直接使用密码来进行远程连接和远程拉取文件. 使用前提:对于未连接过的主机.而又不输入yes进行确认,需要进行sshd服务的优化: # vim /etc/ssh/ssh_con ...
- LVS.md
LVS 概述 简介 LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,官方站点.现在LVS已经是 Linux标准内核的一部分, ...
- python不用正则过渡括号
- Ubuntu root 密码忘记-恢复
@Ubuntu root 密码忘记-恢复 2012-04-27 11:09:22 方法一: 如果用户具有sudo权限,那么直接可以运行如下命令: #sudo su root #passwd #更改密码 ...
- BZOJ1499:[NOI2005]瑰丽华尔兹(DP,单调队列)
Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是很少有几个人知道,世界上最伟大的钢琴家一生都漂泊在 ...
- gluoncv 训练自己的数据集,进行目标检测
跑了一晚上的模型,实在占GPU资源,这两天已经有很多小朋友说我了.我选择了其中一个参数. https://github.com/dmlc/gluon-cv/blob/master/scripts/de ...
- 【[HNOI2012]矿场搭建】
抄题解真开心 我真是越来越菜了 这是点双的板子题,于是求出所有点双,之后讨论 如果点双里之有一个割点,那么如果这个割点炸了,这个点双就出不去了,于是我们得在这个点双内部除了这个割点位置放一个 如果有两 ...