windows 服务程序

21
Windows 服服服服 服服服服服服服服服服服服服 服服服服服服服服服服服服 服服

Upload: rae

Post on 16-Jan-2016

122 views

Category:

Documents


0 download

DESCRIPTION

Windows 服务程序. 大连现代高技术发展有限公司 数字医疗事业部医疗软件部 刘兴. 主要内容. 1.Windows 服务程序介绍 2. 使用 VC++ 开发 Windows 服务程序. 一、 Windows 服务程序介绍. 在 2000/XP 等基于 NT 的操作系统中,有一个 服务控制管理器 SCM ( Service Control Manager) ,它管理的后台进程被称为服务( Service ) 。 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Windows  服务程序

Windows 服务程序

大连现代高技术发展有限公司数字医疗事业部医疗软件部

刘兴

Page 2: Windows  服务程序

主要内容1.Windows 服务程序介绍2. 使用 VC++ 开发 Windows 服务程序

Page 3: Windows  服务程序

一、 Windows 服务程序介绍 在 2000/XP 等基于 NT 的操作系统中,有一个服务控制管理器 SCM ( Service Control Manager) ,它管理的后台进程被称为服务( Service) 。 服务是一种应用程序类型,它在后台悄悄运行。我们通过将自己的程序登记为服务,可以使自己的程序不出现在任务管理器中,并且随系统启动而最先运行,随系统关闭而最后停止。

Page 4: Windows  服务程序

有人可能会说写一个没有界面的普通应用程序,再在 Windows 的启动菜单上加上它,不是一样可以吗?但是放在启动菜单上的普通应用程序在 Windows 没有登录前是永远也不会执行的。而服务程序会在登录系统时自动运行,甚至在没有用户登录系统的情况下也会正常执行。

服务程序大多是控制台程序,不过也有少数的 GUI 程序。服务应用程序通常可以在本地和通过网络为用户提供一些功能,例如

Page 5: Windows  服务程序

客户端 / 服务器应用程序、 Web 服务器、数据库服务器以及其他基于服务器的应用程序。 服务有两种不同的形式。驱动器服务使用驱动器协议,让 NT 可以与特定的硬件进行通信。另一个是 Win32 服务,通过一般的 Win32 API 来实现后台任务。

每个 Windows NT/2000 系统都有一个SCM , SCM 存在于 Service.exe 中,在Windows 启动的时候会自动运行,伴随着

Page 6: Windows  服务程序

操作系统的启动和关闭而产生和终止。这个进程以系统特权运行,并且提供一个统一的、安全的手段去控制服务。它其实是一个 RPC Server 。 SCM 包含一个储存着已安装的服务和驱动程序的信息的数据库,通过 SCM 可以统一的、安全的管理这些信息,因此一个服务程序的安装过程就是将自身的信息写入这个数据库。

Page 7: Windows  服务程序

二、使用 VC++/MFC 开发 Windows 服务程序

Page 8: Windows  服务程序

2.1 用 ATL 工程 编写服务程序 1. 步骤 首先,我们新建一个 Project 。如下图所示:

选择 “ ATL COMAppWizard” ,工程名为:ServiceDemo 。点击 “ OK ” 进入一下步。

Page 9: Windows  服务程序

选择 Service [EXE] 。点击 Finish 。

Page 10: Windows  服务程序

2. 运行机制

入口函数 : _tWinMain()( 全局 )

初始化函数 : Init()

服务开始运行时函数 :Run()

Page 11: Windows  服务程序

3.需要注意的问题 1)如果你想在“控制面板 -> 管理工具 ->服务”里看到自己的服务程序,请在 VC 工程的 Project->Setting->Debug->Program arguments里加上 -RegServer或 -Service 运行参数。其中 -RegServer 是本地服务器注册,-Service 是服务注册。如果想删除此服务程序,把参数设置 -UnregServer 。

Page 12: Windows  服务程序

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  服务程序

4)如果你想使用部门自己的类库,请在“ Project->Setting->General” 的“ Microsoft

Foundation Classes” 选项中选择“ Use MFC

in a Shared DLL”项以去掉一些警告( MSDN

说这些警告是正常的)。

Page 14: Windows  服务程序

2.2 使用 API 自己动手写 Windows 服务程序

原因 :由于建基于 ATL 的工程很难显 示 MFC 的界面 ( 个人这么认为 ) 。

Page 15: Windows  服务程序

1. 过程

先创建一个普通的 MFC 工程(试过基于对话框工程),然后使用 API创建服务程序。

Page 16: Windows  服务程序

2.API 介绍(参数省略)1)OpenSCManager ()打开 SCM 服务

器2) CreateService ()创建服务程序3)OpenService ()打开服务程序4) DeleteService ()删除服务程序5) SetServiceStatus ()设置服务程序属 性6)QueryServiceStatus ()查询服务程序

属性

Page 17: Windows  服务程序

7) ControlService ()设置服务程序的状态8) CloseServiceHandle ()关闭由Open

SCManager ()、 CreateService () 、

OpenService ()三个函数产生的句柄9) RegisterServiceCtrlHandler ()注册 SCM 服务器消息的处理函数10) StartServiceCtrlDispatcher ()分配服 务程序消息

Page 18: Windows  服务程序

3. 使用 API

1)创建服务程序 使用 OpenSCManager ()打开 SCM ,

使用 CreateService ()创建服务程序, 使用 CloseServiceHandle ()关闭服务程

序的句柄。

Page 19: Windows  服务程序

2)删除服务程序 使用 OpenSCManager ()打开 SCM ,

使用 OpenService ()打开服务程序,使用 ControlService ()设置服务程序的状态为停止。使用 QueryServiceStatus查询服务程序的当前状态,如果当前状态为停止,调用 DeleteService ()删除服务程序。调用 CloseServiceHandle ()关闭 OpenSCMan

ager ()、 OpenService () 产生的句柄。

Page 20: Windows  服务程序

3)分配消息 创建完服务程序后调用 StartServiceCtrl

Dispatcher () 分配消息处理, Windows

回调 RegisterServiceCtrlHandler ()为服务程序注册 SCP (Service ControlDispatcher)消息处理函数。 SCP允许用户开始、停止、暂停、继续,并且控制一个或多个安装在计算机上服务的 Win32 应用程序,SCP 的作用是与 SCM 通讯, Windows 2000管理工具中的“服务”就是一个典型的 SCP 。

Page 21: Windows  服务程序

4)调试服务程序 为了方便调试,我们可以先写好调试、安装、删除等函数,根据 VC++ 的命令行参数来执行如调试、安装、删除等操作。