Download - Windows 服务程序
![Page 1: Windows 服务程序](https://reader033.vdocuments.mx/reader033/viewer/2022061501/56814bfa550346895db8f4c8/html5/thumbnails/1.jpg)
Windows 服务程序
大连现代高技术发展有限公司数字医疗事业部医疗软件部
刘兴
![Page 2: Windows 服务程序](https://reader033.vdocuments.mx/reader033/viewer/2022061501/56814bfa550346895db8f4c8/html5/thumbnails/2.jpg)
主要内容1.Windows 服务程序介绍2. 使用 VC++ 开发 Windows 服务程序
![Page 3: Windows 服务程序](https://reader033.vdocuments.mx/reader033/viewer/2022061501/56814bfa550346895db8f4c8/html5/thumbnails/3.jpg)
一、 Windows 服务程序介绍 在 2000/XP 等基于 NT 的操作系统中,有一个服务控制管理器 SCM ( Service Control Manager) ,它管理的后台进程被称为服务( Service) 。 服务是一种应用程序类型,它在后台悄悄运行。我们通过将自己的程序登记为服务,可以使自己的程序不出现在任务管理器中,并且随系统启动而最先运行,随系统关闭而最后停止。
![Page 4: Windows 服务程序](https://reader033.vdocuments.mx/reader033/viewer/2022061501/56814bfa550346895db8f4c8/html5/thumbnails/4.jpg)
有人可能会说写一个没有界面的普通应用程序,再在 Windows 的启动菜单上加上它,不是一样可以吗?但是放在启动菜单上的普通应用程序在 Windows 没有登录前是永远也不会执行的。而服务程序会在登录系统时自动运行,甚至在没有用户登录系统的情况下也会正常执行。
服务程序大多是控制台程序,不过也有少数的 GUI 程序。服务应用程序通常可以在本地和通过网络为用户提供一些功能,例如
![Page 5: Windows 服务程序](https://reader033.vdocuments.mx/reader033/viewer/2022061501/56814bfa550346895db8f4c8/html5/thumbnails/5.jpg)
客户端 / 服务器应用程序、 Web 服务器、数据库服务器以及其他基于服务器的应用程序。 服务有两种不同的形式。驱动器服务使用驱动器协议,让 NT 可以与特定的硬件进行通信。另一个是 Win32 服务,通过一般的 Win32 API 来实现后台任务。
每个 Windows NT/2000 系统都有一个SCM , SCM 存在于 Service.exe 中,在Windows 启动的时候会自动运行,伴随着
![Page 6: Windows 服务程序](https://reader033.vdocuments.mx/reader033/viewer/2022061501/56814bfa550346895db8f4c8/html5/thumbnails/6.jpg)
操作系统的启动和关闭而产生和终止。这个进程以系统特权运行,并且提供一个统一的、安全的手段去控制服务。它其实是一个 RPC Server 。 SCM 包含一个储存着已安装的服务和驱动程序的信息的数据库,通过 SCM 可以统一的、安全的管理这些信息,因此一个服务程序的安装过程就是将自身的信息写入这个数据库。
![Page 7: Windows 服务程序](https://reader033.vdocuments.mx/reader033/viewer/2022061501/56814bfa550346895db8f4c8/html5/thumbnails/7.jpg)
二、使用 VC++/MFC 开发 Windows 服务程序
![Page 8: Windows 服务程序](https://reader033.vdocuments.mx/reader033/viewer/2022061501/56814bfa550346895db8f4c8/html5/thumbnails/8.jpg)
2.1 用 ATL 工程 编写服务程序 1. 步骤 首先,我们新建一个 Project 。如下图所示:
选择 “ ATL COMAppWizard” ,工程名为:ServiceDemo 。点击 “ OK ” 进入一下步。
![Page 9: Windows 服务程序](https://reader033.vdocuments.mx/reader033/viewer/2022061501/56814bfa550346895db8f4c8/html5/thumbnails/9.jpg)
选择 Service [EXE] 。点击 Finish 。
![Page 10: Windows 服务程序](https://reader033.vdocuments.mx/reader033/viewer/2022061501/56814bfa550346895db8f4c8/html5/thumbnails/10.jpg)
2. 运行机制
入口函数 : _tWinMain()( 全局 )
初始化函数 : Init()
服务开始运行时函数 :Run()
![Page 11: Windows 服务程序](https://reader033.vdocuments.mx/reader033/viewer/2022061501/56814bfa550346895db8f4c8/html5/thumbnails/11.jpg)
3.需要注意的问题 1)如果你想在“控制面板 -> 管理工具 ->服务”里看到自己的服务程序,请在 VC 工程的 Project->Setting->Debug->Program arguments里加上 -RegServer或 -Service 运行参数。其中 -RegServer 是本地服务器注册,-Service 是服务注册。如果想删除此服务程序,把参数设置 -UnregServer 。
![Page 12: Windows 服务程序](https://reader033.vdocuments.mx/reader033/viewer/2022061501/56814bfa550346895db8f4c8/html5/thumbnails/12.jpg)
2)如果你想使用 MFC 的类,请在工程文件 StdAfx.h文件的 #include <atlbase.h> 前面加上 #include<afxwin.h> 一行,以包括MFC头文件。
3)如果你想使用部门自己的类库,请在 #include<afxwin.h> 下加上自己的诸如MCMN.h头文件 (只是一个建议,可以在需要的地方包含相关头文件) 。如果出现编译错误,请在部门自己的类库前面包含诸如 #include <afxcmn.h> 、 #include <afxext.h>头文件。
![Page 13: Windows 服务程序](https://reader033.vdocuments.mx/reader033/viewer/2022061501/56814bfa550346895db8f4c8/html5/thumbnails/13.jpg)
4)如果你想使用部门自己的类库,请在“ Project->Setting->General” 的“ Microsoft
Foundation Classes” 选项中选择“ Use MFC
in a Shared DLL”项以去掉一些警告( MSDN
说这些警告是正常的)。
![Page 14: Windows 服务程序](https://reader033.vdocuments.mx/reader033/viewer/2022061501/56814bfa550346895db8f4c8/html5/thumbnails/14.jpg)
2.2 使用 API 自己动手写 Windows 服务程序
原因 :由于建基于 ATL 的工程很难显 示 MFC 的界面 ( 个人这么认为 ) 。
![Page 15: Windows 服务程序](https://reader033.vdocuments.mx/reader033/viewer/2022061501/56814bfa550346895db8f4c8/html5/thumbnails/15.jpg)
1. 过程
先创建一个普通的 MFC 工程(试过基于对话框工程),然后使用 API创建服务程序。
![Page 16: Windows 服务程序](https://reader033.vdocuments.mx/reader033/viewer/2022061501/56814bfa550346895db8f4c8/html5/thumbnails/16.jpg)
2.API 介绍(参数省略)1)OpenSCManager ()打开 SCM 服务
器2) CreateService ()创建服务程序3)OpenService ()打开服务程序4) DeleteService ()删除服务程序5) SetServiceStatus ()设置服务程序属 性6)QueryServiceStatus ()查询服务程序
属性
![Page 17: Windows 服务程序](https://reader033.vdocuments.mx/reader033/viewer/2022061501/56814bfa550346895db8f4c8/html5/thumbnails/17.jpg)
7) ControlService ()设置服务程序的状态8) CloseServiceHandle ()关闭由Open
SCManager ()、 CreateService () 、
OpenService ()三个函数产生的句柄9) RegisterServiceCtrlHandler ()注册 SCM 服务器消息的处理函数10) StartServiceCtrlDispatcher ()分配服 务程序消息
![Page 18: Windows 服务程序](https://reader033.vdocuments.mx/reader033/viewer/2022061501/56814bfa550346895db8f4c8/html5/thumbnails/18.jpg)
3. 使用 API
1)创建服务程序 使用 OpenSCManager ()打开 SCM ,
使用 CreateService ()创建服务程序, 使用 CloseServiceHandle ()关闭服务程
序的句柄。
![Page 19: Windows 服务程序](https://reader033.vdocuments.mx/reader033/viewer/2022061501/56814bfa550346895db8f4c8/html5/thumbnails/19.jpg)
2)删除服务程序 使用 OpenSCManager ()打开 SCM ,
使用 OpenService ()打开服务程序,使用 ControlService ()设置服务程序的状态为停止。使用 QueryServiceStatus查询服务程序的当前状态,如果当前状态为停止,调用 DeleteService ()删除服务程序。调用 CloseServiceHandle ()关闭 OpenSCMan
ager ()、 OpenService () 产生的句柄。
![Page 20: Windows 服务程序](https://reader033.vdocuments.mx/reader033/viewer/2022061501/56814bfa550346895db8f4c8/html5/thumbnails/20.jpg)
3)分配消息 创建完服务程序后调用 StartServiceCtrl
Dispatcher () 分配消息处理, Windows
回调 RegisterServiceCtrlHandler ()为服务程序注册 SCP (Service ControlDispatcher)消息处理函数。 SCP允许用户开始、停止、暂停、继续,并且控制一个或多个安装在计算机上服务的 Win32 应用程序,SCP 的作用是与 SCM 通讯, Windows 2000管理工具中的“服务”就是一个典型的 SCP 。
![Page 21: Windows 服务程序](https://reader033.vdocuments.mx/reader033/viewer/2022061501/56814bfa550346895db8f4c8/html5/thumbnails/21.jpg)
4)调试服务程序 为了方便调试,我们可以先写好调试、安装、删除等函数,根据 VC++ 的命令行参数来执行如调试、安装、删除等操作。