windows服务

什么是 Windows 服务 Windows 服务是 Windows 操作系统的核心。它们控制着操作系统的运行,定义了图形用户界面(GUI)与系统硬件之间的通信以及其他许多功能。没有这些服务,Windows 操作系统将无法正常运行。对普通用户而言,可以简单将 Windows 服务视为没有界面的普通应用程序,无需用户干预即可启动和停止。它们是 Windows 操作系统所必需的,用于创建和执行需要长时间运行的进程,以执行不同的任务。虽然 Windows 服务独立运行且无需用户干预,但它们也可能遇到问题。它们可能会损坏,或者在需要时停止运行。 阅读详情

本文是Devour Heavens撰写整理的关于windows服务的知识,所有资料均来自于msdn官方文档,欢迎转载。但是为了尊重原作者的劳动,请注明出处!谢谢!

windows服务

1.基本概念

服务是一种在系统中常驻的程序,服务可以在系统启动时自启动(先于用户登录)。当一个应用程序需要常驻在系统,或者随时为其他应用程序提供服务时,可以使用服务应用程序。一般编写网络服务端程序时需要使用服务。windows系统中具有一个服务控制器(SCM)用于控制服务。

1.1 服务控制器(SCM)

服务控制器对系统中所有服务进行管理,SCM管理着系统中已经安装的服务应用程序和设备驱动程序数据库,数据库中保存的信息包括系统安装了哪些服务,每个服务包括包括如何启动每个服务、各个服务的安全属性以及控制接口等。

服务程序、服务配置程序和服务控制程序的设计都需要使用SCM提供的函数。

1.2 服务程序(Service Programs)

一个服务程序包含的可执行代码可以为一个或多个服务使用。服务程序以SERVICE_WIN32_OWN_PROCESS类型创建表示为一个服务拥有,以SERVICE_WIN32_SHARE_PROCESS创建表示为多个服务所共享。SERVICE_FILE_SYSTEM_PROCESS 类型表示文件系统驱动服务,SERVICE_KERNEL_DRIVER 类型表示驱动服务。

一个服务程序至少包括入口函数、服务主函数、控制处理函数。

1.2.1 入口函数

入口函数是可执行程序的起点,服务程序的入口函数与一般可执行程序的入口函数没有区别。

1.2.2 服务主函数ServiceMain

服务主函数一般称作ServiceMain函数。但是服务主函数的名称与线程函数ThreadPro一样,其函数名并没有特殊要求,只是其参数接口和调用类型必须与要求一致。ServiceMain函数的原型如下:

VOID WINAPI ServiceMain( 

 DWORD dwArgc, 

 LPTSTR *lpszArgv);

服务函数的参数与main函数的参数使用方法类似,但是服务主函数的参数不是通过在命令行自启动时设定的,而是通过SCM的相关API进行传递的(StartService)。

向SCM注册服务的主函数StartServiceCtrlDispatcher,服务程序通过调用它设置服务主函数,同时通知SCM。

StartServiceCtrlDispatcher函数的原型如下:

BOOL WINAPI StartServiceCtrlDispatcher( 

const SERVICE_TABLE_ENTRY *lpServiceTable

);

结构体SERVICE_TABLE_ENTRY的原型如下:

typedef struct _SERVICE_TABLE_ENTRY { 

LPTSTR lpServiceName; 

LPSERVICE_MAIN_FUNCTION lpServiceProc;

} SERVICE_TABLE_ENTRY, *LPSERVICE_TABLE_ENTRY;

其中lpServiceName为服务名称,lpServiceProc为指向ServiceMain的函数指针。只要将函数的指针赋值给lpServiceProc,再调用StartServiceCtrlDispatcher,这个函数就成为了服务主函数。

1.2.3 控制处理函数

控制处理函数用于处理SCM向服务传递的服务控制请求。控制处理函数Handler原型如下:

VOID WINAPI Handler(

  DWORD fdwControl

);

与ServiceMain函数一致,其函数名没有特殊要求。

注册控制管理函数API函数RegisterServiceCtrlHandler用于向SCM设置一个服务的控制处理函数。

SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandler(

  LPCTSTR lpServiceName,

  LPHANDLER_FUNCTION lpHandlerProc

);

其中lpServiceName为服务名称,lpHandlerProc为Handler函数指针。

1.2.4 服务程序解析


#include <windows.h>
SERVICE_STATUS          SplSrvServiceStatus;
SERVICE_STATUS_HANDLE   SplSrvServiceStatusHandle;
VOID SvcDebugOut(LPSTR String, DWORD Status);
VOID WINAPI SplSrvServiceCtrlHandler (DWORD opcode);
VOID WINAPI SplSrvServiceStart (DWORD argc, LPTSTR *argv);
DWORD SplSrvServiceInitialization (DWORD argc, LPTSTR *argv,
           DWORD *specificError);
VOID WINAPI SplSrvServiceStart (DWORD argc, LPTSTR *argv)
{
 DWORD status;
 DWORD specificError;
 // 填充SERVICE_STATUS 结构
 SplSrvServiceStatus.dwServiceType        = SERVICE_WIN32;
 SplSrvServiceStatus.dwCurrentState      
  = SERVICE_START_PENDING;  
 SplSrvServiceStatus.dwControlsAccepted  
  = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;
 SplSrvServiceStatus.dwWin32ExitCode      = 0;
 SplSrvServiceStatus.dwServiceSpecificExitCode = 0;
 SplSrvServiceStatus.dwCheckPoint         = 0;
 SplSrvServiceStatus.dwWaitHint           = 0;
 // 注册服务控制请求处理例程
 SplSrvServiceStatusHandle = RegisterServiceCtrlHandler(
  "Sample_Srv",
  SplSrvServiceCtrlHandler); 

 if (SplSrvServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
 {
  SvcDebugOut(" [SPLSRV_SERVICE] RegisterServiceCtrlHandler "
   "failed %d\n", GetLastError());
  return;
 } 
 
 status = SplSrvServiceInitialization(argc,argv, &specificError); 
 if (status != NO_ERROR)
 {
  SplSrvServiceStatus.dwCurrentState       = SERVICE_STOPPED;
  SplSrvServiceStatus.dwCheckPoint         = 0;
  SplSrvServiceStatus.dwWaitHint           = 0;
  SplSrvServiceStatus.dwWin32ExitCode      = status;
  SplSrvServiceStatus.dwServiceSpecificExitCode = specificError;

  SetServiceStatus (SplSrvServiceStatusHandle, &SplSrvServiceStatus);
  return;
 }
 SplSrvServiceStatus.dwCurrentState       = SERVICE_RUNNING;
 SplSrvServiceStatus.dwCheckPoint         = 0;
 SplSrvServiceStatus.dwWaitHint           = 0;

 if (!SetServiceStatus (SplSrvServiceStatusHandle, &SplSrvServiceStatus))
 {
  status = GetLastError();
  SvcDebugOut(" [SPLSRV_SERVICE] SetServiceStatus error %ld\n",status);
 }
 SvcDebugOut(" [SPLSRV_SERVICE] Returning the Main Thread \n",0);

 return;
}


DWORD SplSrvServiceInitialization(DWORD   argc,
          LPTSTR  *argv,
          DWORD *specificError)
{
 return(0);
}

VOID WINAPI SplSrvServiceCtrlHandler (DWORD Opcode)
{
 DWORD status;
 switch(Opcode)
 {
 case SERVICE_CONTROL_PAUSE:
  
  SplSrvServiceStatus.dwCurrentState = SERVICE_PAUSED;
  break;
 case SERVICE_CONTROL_CONTINUE:
  
  SplSrvServiceStatus.dwCurrentState = SERVICE_RUNNING;
  break;
 case SERVICE_CONTROL_STOP:
  
  SplSrvServiceStatus.dwWin32ExitCode = 0;
  SplSrvServiceStatus.dwCurrentState  = SERVICE_STOPPED;
  SplSrvServiceStatus.dwCheckPoint    = 0;
  SplSrvServiceStatus.dwWaitHint      = 0;

  if (!SetServiceStatus (SplSrvServiceStatusHandle,
   &SplSrvServiceStatus))
  {
   status = GetLastError();
   SvcDebugOut(" [SPLSRV_SERVICE] SetServiceStatus error %ld\n",
    status);
  } 
  SvcDebugOut(" [SPLSRV_SERVICE] Leaving SplSrvService \n",0);
  return;
 case SERVICE_CONTROL_INTERROGATE:
  
  MessageBeep(MB_OK);
  break;
 default:
  SvcDebugOut(" [SPLSRV_SERVICE] Unrecognized opcode %ld\n",
   Opcode);
 }
 if (!SetServiceStatus (SplSrvServiceStatusHandle,  &SplSrvServiceStatus))
 {
  status = GetLastError();
  SvcDebugOut(" [SPLSRV_SERVICE] SetServiceStatus error %ld\n",
   status);
 }
 return;
}

void main( )
{
 SERVICE_TABLE_ENTRY   DispatchTable[] =
 {
  { "Sample_Srv", (LPSERVICE_MAIN_FUNCTION) SplSrvServiceStart },
  { NULL, NULL }
 };
 if (!StartServiceCtrlDispatcher( DispatchTable))
 {
  SvcDebugOut(" [SPLSRV_SERVICE] StartServiceCtrlDispatcher (%d)\n",
   GetLastError());
 }
}

VOID SvcDebugOut(LPSTR String, DWORD Status)
{
 CHAR  Buffer[1024];
 if (strlen(String) < 1000)
 {
  wsprintf(Buffer, String, Status);
  OutputDebugString(Buffer);
 }
}

 

 

 

使用 Visual Studio 开发 Windows 服务 本文详细讲解了如何使用 C# 创建和实现 Windows 服务,帮助开发者理解服务的生命周期管理、日志记录与错误处理机制。通过示例代码和配置文件,您将掌握创建稳定、可靠的后台服务应用程序的技巧,满足长时间运行的需求。 阅读详情

相关推荐

27、基于 Windows 服务的 WCF 服务托管

本文详细介绍了如何在Windows服务中托管WCF服务,涵盖Windows服务的基本概念、服务的创建与安装、WCF服务的托管配置以及常见问题的解决方法。通过实验演示了从创建Windows服务、处理启动停止事件、配置安装程序到生成客户端代理和测试服务的完整流程。此外,还提供了优化建议和注意事项,以帮助开发者高效稳定地部署WCF服务。

hhh00的博客 192

50.服务程序SERVICE_STATUS、SERVICE_STATUS_HANDLE、RegisterServiceCtrlHandler、SetServiceStatus、SERVICE_TABL

开始之前,先了解几个结构体 SERVICE_STATUS 是服务状态机构,用于标记服务的状态 typedef struct _SERVICE_STATUS { DWORD dwServiceType; //服务可执行文件的类型 DWORD dwCurrentState; DWORD dwControlsAccepted; DWORD dwWin32E...

单于的学习历程 3049

C# 开发 Windows 服务实例详解

Windows服务是Windows操作系统中的一种后台进程,它不需要用户登录即可运行,并且可以执行如监控硬件状态、提供网络服务等任务。与常规应用程序不同,服务通常在用户无法看到的环境中运行,为系统和应用程序提供支持。对于IT行业来说,理解和应用Windows服务是构建稳定、可靠系统的关键。服务可以实现特定功能,如网络服务、系统监控、数据库管理等,而且不需要用户登录即可运行。开发Windows服务可以使用多种工具和语言,如C#结合.NET框架。

weixin_42405592的博客 1442

Windows 编程之服务-1

一、 编写服务程序 一个服务程序至少包括一个入口函数、服务主函数和控制处理函数。 1. 入口函数  入口函数是可执行程序执行的起点,服务程序的入口函数与一般的可执行程序的入口函数 没有区别。 2. 服务主函数 一个服务程序必须具有服务主函数,服务主函数 是服务启动时执行的入口,也是服务的主线程执行起点。  ① 服务主函数 ServiceMain  服务主函数一般称作ServiceMa

u011529563的专栏 894

Vitis开发环境下的双核ARM通信:Hello World背后的AMP架构解析

本文深入解析了Vitis开发环境下ZYNQ双核ARM Cortex-A9处理器的AMP架构与通信机制。通过详细的硬件配置、内存分配和核间通信实现步骤,展示了如何构建高效的双核Hello World系统,为嵌入式系统开发者提供了实用的开发指南和性能优化技巧。

weixin_29162439的博客 218

第五节 Amesim《直动型溢流阀HCD建模》HCD5 学习资料

利用HCD原则创建直动型溢流阀的界面。这可能包括图形化表示直动型溢流阀的工作原理、操作方式和调节方法。这样的界面应当直观且易于理解,使用户能够轻松了解阀门的功能和使用方法。

m0_58052642的博客 1330

Windows服务程序的原理及实现

今天给大家讲下怎样做一个服务程序...本来是想详细讲的,不过写着写着累得要命..很多  地方就没详细...不过代码我加了点注...如果还有一些不明白的自己查下MSDN......便宜  环境,,VC++6.0...代码有俩段,一段是服务程序的..另一段是安装服务程序的...这个程序  的功能是开机发出滴滴声....安装成功后自己点启动...下次开机就自动起动了....

jiangxinyu的专栏 4594

从d、q轴电流到电机性能:FOC控制中角度偏移的实战影响与调试策略

本文深入探讨了永磁同步电机FOC控制中d、q轴电流与角度偏移对电机性能的影响及调试策略。通过分析角度偏移导致的效率下降、电流异常等问题,提供了实用的四步调试法和参数优化技巧,帮助工程师有效提升电机控制精度和效率。

weixin_29264201的博客 294

Windows服务编写

摘要:几乎所有的操作系统在启动的时候都会启动一些不需要与用户交互的进程,这些进程在Windows中就被称作服务。它由服务程序、服务控制程序(SCP,service control program)和服务控制管理器(SCM,service control manager)三个组件构成。本文针对服务程序与服务控制程序的编写进行综合讲述。    关键词:Windows,服务,VC++•1    

lziog的专栏 1805

YOLOv13涨点改进| CVPR 2026 |独家创新首发、主干改进篇 |利用RIS-PiDiNet主干让YOLOv13更加强大!适合遥感目标检测、小目标检测、旋转目标检测,变化检测,图像分割涨点

🔥本文提出了一种改进的RIS-PiDiNet主干网络,通过引入几何先验构建几何一致性检测器,显著提升了模型在任意方向、结构规则目标场景下的检测性能。包含两个核心模块:S-PDC利用极谐变换的谐波核建模目标结构对称性,RIS-PDC通过SO(2)群平均实现旋转不变性。网络采用基于RIS-block的主干结构并融合轻量级LBP特征,增强了细粒度结构表达能力。实验表明,该方法特别适用于遥感和复杂几何分布场景,能有效提升目标检测的鲁棒性和精度。文章还详细介绍了如何将RIS-PiDiNet集成到YOLOv13框架

Ai缝合怪、助力小伙伴高效发论文 90

deepstream车道线检测自定义插件化,其中要注意pipeline的配置,如果插件位置配置不对,会报input format should be RGBA when using blur-obje

以上代码中,我们先从对象池中获取一个 DsUserMeta 对象,然后使用 get_lane_line_from_frame 函数获取车道线检测结果,并使用 add_lane_line_meta 函数将其添加到 DsUserMeta 对象中。注意,上述代码中的 get_lane_line_from_frame 函数和 add_lane_line_meta 函数需要你自己实现,用于从视频帧中提取车道线检测结果,并将其添加到 DsUserMeta 中。

pvmsmfchcs的博客 690

2-Windows服务之相关API说明

它将等待一个服务完成对服务控制通知的处理,然后再发送下一个服务控制通知。在32位机器上,如果设置了服务依赖(例如:lpDependencies参数设置为Tcpip),则lpLoadOrderGroup参数不能设置为NULL,而需要设置为“”空字符串,否则函数会报错,GetLastError()返回1059(指定了循环服务依赖关系),原因未知。ControlService函数要求SCM发送指定的控制码给服务,如果服务已指定将接受代码,并且处于可以向其发送控制码的状态,则SCM将发送指定的控制码。

weixin_40332490的博客 1215

第8讲:基于CST PCB Studio的电源完整性仿真(IR Drop + PDN)

本文系统介绍了电源完整性(PI)仿真的两大核心模块:直流IRDrop仿真与交流PDN阻抗仿真。文章详细阐述了两种仿真的原理、算法(PEEC和3DFE-FD)及完整操作流程,包括参数配置、软件实操步骤和常见问题解决方案。IRDrop仿真用于分析直流供电压降问题,PDN仿真则针对高频电源噪声和谐振问题。文中还提供了优化建议和故障排查方法,如调整铜箔厚度、优化电容布局等,为高速数字系统的电源完整性设计提供了全面的技术指导。(149字)

一只豌豆象的博客 238

关于Windows服务

这里有一个快速搜索的小技巧:先随意点击任何服务程序,键盘敲出你要搜索的服务的开头字母,再左键点击空白部分。就可以迅速定位到目标服务的区间里。savannah: 是自己指定的服务名称(注意不要和系统中已有的名称没有冲突)sc:是Windows用来创建服务的关键指令。binpath=你要设置的某个程序的路径。打开服务程序有两种方式,一种是直接搜索。二字,另一种是打开计算机管理。,点开服务和应用程序,选择服务即可。create:创建的意思。

weixin_50045856的博客 5580

simulink建模仿真实例1000例--第375例:基于Simulink进行复杂交通流的仿真建模

特点多车互动:模拟多个车辆之间的相互作用。动态变化:交通流量随时间和事件(如事故、天气变化)而变化。多样化驾驶行为:考虑不同的驾驶员行为模式(激进型、保守型等)。挑战准确性:准确地模拟各种因素对交通流的影响。实时性:处理大量车辆数据,并迅速做出反应。可扩展性:支持从简单场景到复杂城市交通网络的扩展。首先明确要模拟的任务内容。模拟不同类型的车辆(轿车、卡车、公交车等)。考虑不同驾驶员的行为模式。分析交通拥堵、事故对交通流的影响。

xiaoheshang_123的博客 202

传感器应用案例:压力传感器在工业自动化中的应用_(13).压力传感器的数据采集与处理

数据采集系统(Data Acquisition System, DAS)是连接传感器和控制系统的重要桥梁。它包括硬件(如数据采集卡、信号调理器)和软件(如数据采集软件、数据处理算法)两部分。信号调理:将传感器输出的模拟信号转换为适合AD转换的信号。AD转换:将模拟信号转换为数字信号。数据传输:将数字信号传输到控制系统或上位机。存储:将采集的数据存储在本地或远程数据库中。实时性:保证数据的实时性和准确性。压力传感器的数据采集与处理是工业自动化中不可或缺的一部分。

2401_87715305的博客 1620

windows服务简介

文章目录一,Windows服务简介二,SCM服务控制管理器三,服务的启动类型四,三种登录为1,Local System(本地系统)2,Network service(网络服务)3,Local Service(本地服务)五,相关的CMD命令1,net-->只能启停止,不能配查。2,sc①==sc query 服务名== -----查询服务②==sc stop/start 服务名== -...

Z_Grant的博客 7780

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Nacos注册到Windows服务

由于nacos每次启动需要手动进入到nacos下的bin目录中,启动脚本,如图:但是黑窗口一关,nacos服务就会关闭,所以将nacos注册到Windows服务中,开机自启。

xulong5000的专栏 1884

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

windows-rs服务控制:启动与停止Windows服务

你是否还在为Windows服务的手动部署与控制感到困扰?面对复杂的服务生命周期管理,是否希望有一种更高效、更安全的方式来实现自动化控制?本文将带你深入探索如何使用windows-rs库(Rust for Windows)构建、安装、启动和停止Windows服务,通过Rust的类型安全特性和现代化API设计,彻底解决传统服务管理中的痛点。 读完本文,你将能够: - 使用windows-rs创建符合...

gitblog_00715的博客 1217

如何删除Windows中不需要的Windows服务

如何删除Windows中不需要的Windows服务

jackiendsc的博客 2269

Windows Search 服务

Windows Search服务是Windows系统的核心后台服务,负责为文件、邮件等内容建立索引以实现快速搜索。主要功能包括:极速搜索文件名和内容、支持多种文件类型、增强用户体验。常见问题有搜索慢、CPU占用高、服务无法启动,可通过重建索引、调整索引范围或重启服务解决。虽然可以禁用该服务,但会导致搜索功能严重退化,仅建议在配置极低的旧设备上使用。保持该服务正常运行对系统效率至关重要。

qq_39741838的博客 1728

Windows服务概述

Windows 服务由三部分组成:服务应用、服务控制程序(SCP)以及服务控制管理器(SCM)。服务应用实质上也是普通的 Windows 可执行程序,但是其必须要符合 SCM的接口和协议规范才能使用。SCP 是一个负责在本地或远程计算机上与 SCM 进行通信的应用程序,负责执行 Windows 服务的启动、停止、暂停、恢复...

cnzzs的博客 897

windows的服务怎么删除

使用删除服务是最直接的方法。如果服务没有成功删除,可以尝试手动编辑注册表。删除 Redis 配置文件和安装目录以完全清除 Redis。按照这些步骤操作,你应该能够成功删除 Redis 服务。

Gao_xu_sheng的博客 6865

[windows服务]windows服务的调试

调试windows服务的方法:1.改造windows服务为普通程序,像普通程序一样调试。2.直接调试跟踪windows服务程序,此方法的调试过程如下:windows服务的调试方法和我们一般的程序方法有些不一样,但是也是在IDE里面调试。MS的IDE也为我们考虑到了这些方面。跟我来看看怎样来调试一个windws服务吧? 大致分为一下几个步骤:1. 建立windows服务程序,不管你是用w

迭代生活,程序人生 1710

删除Windows服务

像我删除卸载了一个软件,结果什么都删除了,结果服务还在那儿,很不雅观,找遍注册表都找不到,只好自己动手写了个小程序来删除服务。读国外的一些原代码,最强的感受到不在于写代码的技巧有多高,而在于注释做得太好了,几乎一些重要的语句都有注释说明作用,希望大家写的程序也都能有良好的注释。在工作线程实际结束的时候,第二个事件的状态被工作线程设置为终止。有兴趣的朋友可以研究一下原页面可以下载的演示工程代码,很好的一个例子,本来我还想自己做一下解析,但是读了几遍作者的解释,觉得差不多了,不用我再费话了。

biyusr的专栏 837

什么是Windows服务

一、什么是Windows服务   Windows服务也称为Windows Service,它是Windows操作系统和Windows网络的基础,属于系统核心的一部分,它支持着整个Windows的各种操作。诸如DNS客户端、打印程序、Windows更新服务、计划任务、Windows时间服务等服务,它们关系到机器能否正确运行。如果不能适当地管理这些服务,就会影响到机器的正常操作。   一个服务

chentracy2008的专栏 2300
上一篇: Boost::regex之正则表达式
下一篇: Windows服务之实现对服务的控制管理
devourHeavens
博客等级 码龄15年 3粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值