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 ...
随机推荐
- 第一个JavaScript代码
既然我们的CSS就必须要要放再专门的style标签内 那么javascript也需要放在子级的标签内,那就是script标签内 在页面中,我们可以在body标签中放入<script type= ...
- angular.js中提供的基础方法
angular.bind angular.callbacks angular.equals /* *Determines if two objects or two values are equiva ...
- ubuntu服务器下tomcat安装(不推荐使用apt-get)
最近在阿里云服务器上装tomcat,一开始为了省事直接使用了apt-get安装,结果整个程序被拆开散到了好多地方,尤其是像网上说要把打包好了.war文件放到webapps文件夹下,但是开始并没有在/u ...
- CATransaction:原子化操作、批量操作、整体设置、自动添加
Transactions are CoreAnimation's mechanism for batching multiple layer- tree operations into atomic ...
- bzoj 4712: 洪水
[权限题][https://www.lydsy.com/JudgeOnline/status.php?problem_id=4712&jresult=4] 这道动态\(dp\)终于不是独立集/ ...
- 关于tomcat无法启动问题详解
通常情况tomcat无法启动,有这么几个原因?(1)代码有问题; (2)tomcat有问题; (3)端口被占; (4)动态web项目为3.0: (5)java环境运行内存不足; 这是比较常见的问题.解 ...
- docker安装后启动不了 解决方法
第一种情况: 可能是你的selinux没有disabled,导致了守护docker的deamon进程启动不了 查看系统日志如果发现下列信息: May 7 12:34:14 localhost dock ...
- datatable的excel导入,其中有关于datatables的很多参数设置
datatable的excel导入,其中有关于datatables的很多参数设置 http://www.cnblogs.com/liyuhuan/p/5633095.html
- 阅读AuTO利用深度强化学习自动优化数据中心流量工程(一)
目录 问题 解决方法 模型选择 框架构建 Sigcomm'18 AuTO: Scaling Deep Reinforcement Learning for Datacenter-Scale Autom ...
- VPP(Vector Packet Processing)配置工具
前言 VPP提供了一个配置工具,让用户可以简单快捷地配置VPP.用户可以通过一些简单的命令配置VPP,功能包括安装及一些基本配置和测试用例. 使用 先安装一个python的pip模块,使用pip安装V ...