VC++ Service编程(二)编写ServiceMain函数

C++编写服务程序 近段时间,在学习使用C++写windows服务。参考了若干的资料,写如下服务,作为学习笔记。 写服务主要有一下步骤 1、使用 StartServiceCtrlDispatcher(SERVICE_TABLE_ENTRY lpServiceStartTable);连接SCM,让SCM控制函数。需要注意的是最后lpServiceStartTable的最后一个结构体的两个属性值都是NULL 2、编 阅读详情

编写ServiceMain函数

    下面例子中的MyServiceStart函数是这个服务的ServiceMain函数。MyServiceStart函数可以使用命令行参数,就像控制台程序中main函数那样的方式。第一个参数是传递给服务的值的个数,并且这个个数的最小值总是1。第二个参数是一个字符数组指针。数组的第一项总是当前服务的名称。

    MyServiceStart函数首先填充一个SERVICE_STATUS结构,其中包含它所要接受的控制请求代码。虽然这个服务接受SERVICE_CONTROL_PAUSE 和 SERVICE_CONTROL_CONTINUE,但在被要求停止的时候,并没有做什么重要的操作。包含SERVICE_ACCEPT_PAUSE_CONTINUE仅仅是为了举一个例子。如果服务暂停时并没有传递进来的参数,不要支持暂停。

    MyServiceStart函数马上调用RegisterServiceCtrlHandler函数,将MyService函数注册成为服务的控制请求处理函数,并且开始作初始化的工作。下面例子中的初始化函数——MyServiceInitialization,只是为了举个例;它没有做任何初始化的工作,比如说创建一个额外的线程。如果服务的初始化工作要花比一秒更长的时间,应该在代码里周期性的调用SetServiceStatus函数建立等待时间和检查点,来指示初始化工作正在进行。

    当初始化成功完成时,例子以SERVICE_RUNNING为参数调用SetServiceStatus函数,并且继续它自己的工作。如果在初始化的过程中遇到错误,则以SERVICE_STOPPED为参数调用SetServiceStatus函数,然后返回。

    因为例子并没有完成什么真的工作,所以它只是简单的将控制权返回给调用函数。让这个函数自己返回,而不是调用ExitThread函数很重要,因为返回时,可以清理为变量开辟的内存。

 

#include <windows.h>

 

SERVICE_STATUS          MyServiceStatus;

SERVICE_STATUS_HANDLE   MyServiceStatusHandle;

 

VOID SvcDebugOut(LPSTR String, DWORD Status);

 

void WINAPI MyServiceStart (DWORD argc, LPTSTR *argv)

{

    DWORD status;

    DWORD specificError;

 

    MyServiceStatus.dwServiceType        = SERVICE_WIN32;

    MyServiceStatus.dwCurrentState       = SERVICE_START_PENDING;

    MyServiceStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP |

        SERVICE_ACCEPT_PAUSE_CONTINUE;

    MyServiceStatus.dwWin32ExitCode      = 0;

    MyServiceStatus.dwServiceSpecificExitCode = 0;

    MyServiceStatus.dwCheckPoint         = 0;

    MyServiceStatus.dwWaitHint           = 0;

 

    MyServiceStatusHandle = RegisterServiceCtrlHandler(

        "MyService",

        MyServiceCtrlHandler);

 

    if (MyServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)

    {

        SvcDebugOut(" [MY_SERVICE] RegisterServiceCtrlHandler

            failed %d ", GetLastError());

        return;

    }

 

    // Initialization code goes here.

    status = MyServiceInitialization(argc,argv, &specificError);

 

    // Handle error condition

    if (status != NO_ERROR)

    {

        MyServiceStatus.dwCurrentState       = SERVICE_STOPPED;

        MyServiceStatus.dwCheckPoint         = 0;

        MyServiceStatus.dwWaitHint           = 0;

        MyServiceStatus.dwWin32ExitCode      = status;

        MyServiceStatus.dwServiceSpecificExitCode = specificError;

 

        SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus);

        return;

    }

 

    // Initialization complete - report running status.

    MyServiceStatus.dwCurrentState       = SERVICE_RUNNING;

    MyServiceStatus.dwCheckPoint         = 0;

    MyServiceStatus.dwWaitHint           = 0;

 

    if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus))

    {

        status = GetLastError();

        SvcDebugOut(" [MY_SERVICE] SetServiceStatus error

            %ld ",status);

    }

 

    // This is where the service does its work.

    SvcDebugOut(" [MY_SERVICE] Returning the Main Thread ",0);

 

    return;

}

 

// Stub initialization function.

DWORD MyServiceInitialization(DWORD   argc, LPTSTR  *argv,

    DWORD *specificError)

{

    argv;

    argc;

    specificError;

    return(0);

}

VC++隐藏DOS窗口:从原理到实践的4种核心方法 在Windows程序开发中,理解控制台程序与图形界面程序的差异是基础。控制台程序默认链接到控制台子系统,系统会为其分配DOS窗口;而Windows桌面程序链接到Windows子系统,从根本上避免了控制台窗口的产生。这一机制的核心在于程序的入口函数和链接器子系统设置。掌握进程创建与控制技术,特别是CreateProcess API配合STARTUPINFO结构,能够实现对子进程窗口状态的精细控制,这对于开发后台服务、系统工具等需要静默运行的程序至关重要。在实际应用中,无论是运行批处理文件还是调用命令行工具,通 阅读详情

相关推荐

用 VC++建立 Windows 服务程序

1.最简单的创建一个windows service程序 (1)新建一个win32控制台程序 (2)开始-&gt;运行-&gt;cmd,必须右键—&gt;以管理员身份运行,此时进入dos命令提示符界面。 (3)输入 sc create test binPath= “D:\Code_Test\VS2012_test\test_console\test_console\Release\test_cons...

技术联盟 2073

服务的ServiceMain函数

当服务控制程序请求运行新服务时,服务控制管理器(SCM)启动服务并向控制调度程序发送启动请求。控制调度程序创建一个新线程来执行服务的ServiceMain功能。 ServiceMain函数应执行以下任务: 初始化所有全局变量。 立即调用RegisterServiceCtrlHandler函数以注册Handler函数来处理服务的控制请求。RegisterServiceCtrlHa...

xinqingwuji的博客 3763

单细胞实战之亚细胞分群从T/NK至CD4+T细胞——从入门到进阶(中级篇1)

亚细胞分群从T/NK至CD4+T细胞

zfyyzhys的博客 6392

VC++ Service编程(四)服务ServiceMain函数

服务ServiceMain函数     当一个服务控制程序请求开启一个新的服务时,SCM(服务控制管理器)开启服务的同时,向控制调度器发送一个开始请求。控制调度器为服务创建一个新的线程来运行ServiceMain函数。     ServiceMain函数应该执行下面的这些任务:     1、立刻为服务调用RegisterServiceCtrlHandlerEx函数,用来注册一个处理控

Wang Shen 5359

LTspice仿真三线制PT100高精度测温系统设计

本文详细介绍了如何使用LTspice仿真设计三线制PT100高精度测温系统。文章从三线制原理出发,逐步讲解了在LTspice中建模PT100、构建惠斯通电桥进行信号转换、设计差分放大与滤波电路、选型ADC以及进行系统联调与误差分析的全过程,旨在帮助工程师实现0.5°C分辨率的工业测温方案设计。

pz89012345的博客 99

香橙派OPi 6系列选型指南:RK3588与RK3588S开发板深度对比

开发板选型是嵌入式系统设计的关键环节,尤其在边缘计算和AI推理等场景中,芯片的差异直接影响硬件架构。瑞芯微RK3588及其精简版RK3588S是当前高端开发板的核心方案,两者在PCIe通道、显示输出和SATA支持上存在显著区别。理解这些原理,有助于工程师根据项目需求快速匹配产品。香橙派OPi 6系列基于这两款芯片,衍生出OPi 6、OPi 6 Pro与OPi 6 Max三种形态:紧凑型适合嵌入式门禁与AI盒子,Pro版凭借双屏异显和PCIe 3.0满足收银机与视频分析,Max的双2.5G网口和大内存则面向轻

weixin_29185167的博客 228

C++:main.cpp里的main()函数调用xxx.cpp里面的函数

1.xxx.hpp文件里声明函数 2.xxx.cpp文件里面定义函数。注意去掉#include "xxx.hpp",不然main.cpp里面调用函数的时候可能会出现重复的错误。后来不去掉也可以了,很迷。。。 3.main.cpp

qq_38253054的博客 1534

Genesis物理引擎实战指南:轻量级确定性刚体仿真核心

刚体物理仿真作为机器人控制、嵌入式运动学验证和确定性游戏开发的基础技术,其核心在于数值稳定性、跨平台可复现性与约束求解精度。本文围绕线性互补问题(LCP)求解、半隐式欧拉积分和零依赖C++实现三大关键技术展开,解析如何在无GUI、低算力环境下构建可单步调试、帧级可控的确定性仿真系统。重点覆盖碰撞检测数学建模、关节局部坐标系绑定、质量-惯性张量一致性校验等工程落地关键点,适用于STM32、树莓派及教育实验场景。内容深度结合Genesis Physics Engine的源码实践,直击‘穿模’‘NaN’‘关节发软

ciya3282的博客 1592

调试dll中的ServiceMain函数

调试dll中的导出函数ServiceMain 1、ServiceMain一般是被服务进程调用执行的,创建服务,启动起来之后,被执行,可以按调试服务的方式调试 2、直接rundll32.exe ServiceMain也行 打开OD,打开文件 C:\Windows\System32\rundll32.exe ,输入参数 C:\1.dll ServiceMain dll文件路径 导出函数名称 r...

weixin_46953583的博客 1419

嘉立创EDA报错:元件引脚与焊盘未对应报错解决记录

原件引脚与焊盘未对应报错解决方法,一文总结!

2303_77013775的博客 1万+

STM32嵌入式标准化封装五层架构设计与工程实践

在嵌入式系统开发中,代码封装是保障可维护性、可复用性与可靠性的核心工程能力。其本质是通过分层抽象(硬件抽象层→设备驱动层→应用逻辑层)解耦硬件依赖与业务逻辑,实现跨芯片移植、多任务安全及确定性实时响应。关键技术包括HAL库重构以消除硬编码初始化、驱动层提供同步/异步/事件驱动三类UART接口、中断优先级矩阵管理确保响应确定性、双阶段时钟配置兼顾启动鲁棒性与运行能效,以及面向Modbus等工业协议的语义化API封装。这些实践直击STM32项目中引脚变更难、HAL裸调风险高、中断处理不安全、时钟配置僵化等典型痛

weixin_35019679的博客 68

如何编写windows服务程序

如何编写windows服务程序 By:张鹏/Hikvision 这两天想学习关于如何编写windows服务程序的知识,就上网查了些资料。看了一篇文章《用C 语言编写Windows 服务程序的五个步骤》。但可能由于译者的疏忽,忘记了将关键代码放入该文档,导致初学者可能会看不懂。所以又查阅了相关资料。自己完成了《用C 语言编写Windows 服务程序的五个步骤》中的样例程序。 在本文中我希望能给

我是榜样的博客 1万+

潇洒郎: 小白一次性成功——红米 Note 12 5G Android12 系统13.0.16/14.0.9 小米红米手机解BL锁+ROOT-刷面具—官方ROM下载-线刷降级—解锁system系统分区

小白一次性成功——红米 Note 12 5G Android12 系统13.0.16/14.0.9 小米红米手机解BL锁+ROOT-刷面具—官方ROM下载-线刷降级—解锁system系统分区

潇洒郎的博客 4585

VC++ Service编程(一)编写main函数

翻译自MSDN,是好多年前我发布在好网博客上的,现在把它转过来 编写服务程序的main函数     服务程序的main函数调用StartServiceCtrlDispatcher函数,将它与SCM(服务控制管理器)联系起来,并开启一个控制调度线程。控制调度线程不停的循环,等待接收在调度表中已经定义好的控制请求。除非程序中的所有服务都中止或者遇到错误,要不这个线程不会返回。当程序中的所有服务

Wang Shen 2467

把外部系统一键装进 SAP Build Work Zone:从零开始创建 HTML5 URL App

HTML5 URL App 是一种轻量级解决方案,可将外部网页或系统入口快速集成到SAP企业门户中。开发者只需在manifest.json中配置目标URL、导航模式等参数,无需开发完整前端应用。该方案利用SAP BTP的HTML5 Application Repository集中存储静态资源,通过HTML5 Apps Content Provider将应用暴露给子账号,最终在SAP Build Work Zone中以Fiori磁贴形式呈现。文章详细介绍了manifest.json的关键配置、三种基础设施组件

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 243

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

文章索引-Windows Service

SERVICE_STATUS结构各成员解析 Windows Service 介绍

Just_So_So~的博客 193

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

用VC++建立Service服务应用程序

用VC++建立Service服务应用程序 为什么要使用服务应该程序呢?服务程序就像系统的一些服务一样,能够自动地启动,并执行相应的操作;而且因为服务程序的在层次上和一般的应用程序不同,其能够在系统启动时就自动地运行,而不像一般的应用程序那样一定要在登陆后才能运行,这些就是服务的一些好处了,如果你也想你的程序具有这样的功能,那么你就可以建立一个服务应用程序了。 下面就跟着我一步一步地

风月流年 604

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

VC++ Service编程(三)服务入口

服务入口     通常,我们把服务做成控制台程序。控制台程序的入口是main函数。main函数从注册表中的ImagePath值来获取参数,提供给服务。     当SCM(服务控制管理器)开启一个服务,它就开始等待这个服务调用StartServiceCtrlDispatcher函数。使用下面的原则:     1、SERVICE_WIN32_OWN_PROCESS类型的服务必须在主线程中马上调用

Wang Shen 1654

C++语言编写windows服务

C++语音编写windows服务 1 windows服务 2 DebugView调试工具 3 c语言编写windows服务 4 将程序作为windows服务1、 windows服务通过快捷键”win+R”打开运行框,输入”services.msc”,就能够打开windows服务。鼠标右键任意一个服务,能看见以下的选项,如下图1.1所示 图1.1 windows服务 本文的内容讲的就是通过wind

西西的博客 1万+

Simple Windows Service in C++

本文是来自CodeProject中的一篇名为Simple Windows Service in C++的译文,原文地址为:https://www.codeproject.com/Articles/499465/Simple-Windows-Service-in-Cplusplus,作者为:Mohit Arora。 这是一篇使用C++展示如何创建简单的Windows服务的文章。源代码下载...

weixin_30662539的博客 135

msdn中windows service例子

http://code.msdn.microsoft.com/CppWindowsService-74bb412c   A basic Windows service in C++ (CppWindowsService) This code sample demonstrates creating a basic Windows Service application in VC++

孙建军的博客 3687

vc++搭建一个NT服务框架

#include #include SERVICE_STATUS m_ServiceStatus;SERVICE_STATUS_HANDLE m_ServiceStatusHandle;BOOL bRunning=true;void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);//服务主函数void WINAPI ServiceCtrlHandler(

尹成的技术博客 3231
上一篇: VC++ Service编程(一)编写main函数
下一篇: VC++ Service编程(三)服务入口
0皮皮0
博客等级 码龄22年 26粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值