天天加油 - 助您成才
Win32位程序设计初步之服务
您正在看的经验技巧是:Win32位程序设计初步之服务。

每个操作系统都需要有在后台执行任务的方法,无论是谁正在使用这部机器,这些任务都可以继续运行,后台任务可以处理各种重要的服务,包括系统的或者用户的。例如,一个信使服务可以监控网络,并且在接收到另一台机子的信息时,可以显示一个对话框。一个发送和接收传真的应用需要在启动的时候运行,并且不断地监控负责传真的modem,看有没有传真进来。一个家庭的或者办公室的安全程序,用来控制一件检测设备时,它需要不时地查询传感器,并且在适当的时候响应它。所有这些任务都需要CPU时间来执行它们,不过由于它们需要的CPU时间很少,因此可以放在后台而不影响用户使用系统。

在MS-DOS中,后台的任务是通过TSR(Terminate and Stay Resident)程序来处理的。这些程序经由autoexec.bat文件开始。在UNIX中,后台任务是通过Daemons来处理的。在每次启动UNIX的过程中,你都可以看到操作系统启动一些任务,例如定时的程序(Cron)和Finger的daemons,然后才可以让首个用户登录。在Windows NT中,后台的任务被称为服务。服务可在每次NT启动的时候运行,并且不管是谁登陆,都会一直运行下去。

Windows NT的服务都是通过一般的可执行程序实现的,不同的是,它遵循内部的一个特定协议来设计,以便它们能够与服务控制管理器(SCM,Service Control Manager)进行正确的交互。在这篇文章中,你将学习到如何在Windows NT中创建和安装简单的Win32服务。一旦你懂得了这个简单的服务,你要建立自己的服务也不难了,因为所有的服务,不论是如何地复杂,都必须包含有同样基本的SCM接口代码。只要符合SCM的要求,其实为服务设计的可执行文件和一般的程序并没有多少的区别。

无论是对于编程者或者系统管理员,了解NT的服务如何工作都是很重要的。编程者就不必说了,因为他们要创建自己的服务,而对于系统管理员,也是同样重要的。因为后台的任务可以是很危险的。MS-DOS和Macintosh系统都是一个病毒的温床,因为它们在安全性方面先天不足,它们都可以允许任何人或者程序在任何时间创建后台的任务。Windows NT和UNIX系统是较安全的,因为只有系统管理员才可以为系统增加后台的任务,不过,如果系统管理员加入了一个破坏性的后台程序,就它就可以为所欲为了。因此系统管理员要了解Windows NT服务的技巧和权限设置,就可以避免加入有潜在危险的后台任务。

基本的概念

服务有两种不同的形式。驱动器服务使用驱动器协议,让NT可以与特定的硬件进行通信。另一个是Win32服务,通过一般的Win32 API来实现后台任务。这篇文章的重点是谈Win32服务,因为它们更为常见,而且创建起来也很容易。任何的NT编程者通过使用一般的NT SDK(或者Visual C++),并且可以用管理员的身份访问一台NT机器,都可以实现和安装自己的Win32服务。如果你想创建一些在Windows NT启动时就运行的程序,并且要求它会在系统中一直运行,你就要使用Win32的服务。

在NT中,服务通过控制面板进行管理。在控制面板中,你会发现有一个服务的图标,打开它你会看到所有Win32服务的清单。在那里你可以开始、停止、暂停和继续某个服务。你按下其中的启动按钮后,就会出现一个对话框,你可以修改启动操作以及服务使用的默认帐号。一个服务可以在系统启动的时候自动运行,也可以被完全禁止。或者设置为手动执行。在手动的时候,用户还可以设置启动的参数。要对服务中的项目作修改的话,你需要以一个管理员或者超级用户的身份登录。

Windows NT自带有一些预装的任务,用来处理诸如网络信使服务的操作或者使用“at”命令定时执行的操作,以及分布的RPC命名。在你创建自己的服务时,你必须执行一个独立的安装步骤,以将服务的信息插入到服务管理工具的列表中,这些信息包括有新服务的名字、执行文件的名字和启动的类型等,都会写入到注册表中,这样在机器下次启动的时候,SCM就会得到新服务的相关信息。

创建一个新的服务

执行服务的程序也是一个EXE文件,不过它必须符合某些特定的规范,以便可以与SCM进行正确的交互。微软很细致地设计了函数调用的流程,你必须遵循这些流程,否则你的服务就不能工作。具体的规定如下所列。你可以在Win32编程者的参考指南中找到以下涉及的函数,这些资料在SDK的Win32在线帮助或者Visual C++都有:

.服务的代码必须要有一个一般的main或者WinMain函数。这个函数应该会马上调用StartServiceCrtlDispatcher函数。通过调用这个函数,你可以让SCM得到ServiceMain函数的指针,这样在SCM要启动该服务时,就可以调用它

.在SCM要启动服务的时候,就会调用ServiceMain函数。例如,如果管理员在服务管理器中按下启动的按钮,SCM就会在一个独立的线程中执行ServiceMain函数。ServiceMain应该调用RegisterServiceCtrlHandler函数,这样可以注册一个Handler函数,以便SCM对服务进行控制。Handler函数的名字可以是任意的,不过它会在Handler下的文档中列出来。RegisterServiceCtrlHandler函数会返回一个句柄,在服务需要发送状态信息给SCM时,可以通过该句柄进行。

.ServiceMain函数也必须启动做该服务实际工作的线程。在服务停止前,ServiceMain函数是不应该有返回的。当它返回的时候,服务已经停止了。

.Handler函数包含了一个switch语句,用来分析由SCM传送过来的请求。默认的情况,SCM可以发送以下任何的的控制常数:

SERVICE_CONTROL_STOP - 要服务停止

SERVICE_CONTROL_PAUSE - 要服务暂停

SERVICE_CONTROL_CONTINUE - 要服务继续

SERVICE_CONTROL_INTERROGATE - 要服务马上报告

1 2 3 4 5 6 下一页

排行

  1. Winodws下Apache+PHP+MySQL的安装
  2. 快照 RegSnap
  3. HKEY_USER 根键(一)
  4. 20:8!超宽屏Vista截图抢鲜
  5. Vista服务优化攻略
  6. Windows Vista:透视未来桌面远景
  7. 不同:Windows Vista的关机组合快
  8. 如何恢复Windows Vista/XP双启动
  9. Vista系列技巧:Vista侧边栏安装
  10. Vista解惑之防火墙10个注意事项
  11. 官方谈Vista OEM盗版激活 承认破
  12. 仅需三分钟 便可轻松破解Vista登
  13. 浅述单核CPU跑Vista 占用率高的原
  14. Vista Areo界面全攻略
  15. 从1.01到Vista Windows启动画面图
  16. 新手不用慌:Vista官方驱动程序大
  1. 解密Windows Vista 5270中的捆绑
  2. Windows Vista SP1截图曝光
  3. Vista启动音乐:18个月就为了这4秒
  4. Windows Vista系统优化软件新版抢
  5. Windows Vista操作系统八大特性抢
  6. 全球首个Windows Vista新闻软件亮
  7. 为何失败 简述Windows Vista中的
  8. 为非主流主机优化 打造最强Vista
  9. Vista 竟是WIN 95以来漏洞最多系
  10. 对Win Vista防火墙进行高级配置
  11. 革命性技术:Win Vista可记录用户
  12. Windows Vista 最佳改进:拷贝文
  13. WindowsVista操作系统使用疑问解
  14. 自己动手丰衣足食 Vista激活不求
  15. 使用BCDEdit修改Windows Vista启
  16. 负责人专访:Windows Vista游戏更
  1. 妙用Windows9x的Desktop.ini文件
  2. Windows Vista系统优化软件新版抢
  3. Windows Vista操作系统八大特性抢
  4. 为何失败 简述Windows Vista中的
  5. WindowsVista操作系统使用疑问解
  6. 使用BCDEdit修改Windows Vista启
  7. 如何从计算机上删除 Windows XP 
  8. 双机热备、双机互备和双机双工三
  9. sap basis系列之三
  10. 给freebsd系统增加一个新硬盘
  11. 我教你学之IE6.0性能注册表修改实
  12. 让光驱运行得更快
  13. 用“类标识符”保护Windows系统文
  14. Windows98安装文件压缩包的释放
  15. VMware Workstation 3.0 综述(四
  16. “细心呵护”Windows日志文件

最近更新

  • 推荐阅读
  • 经验技巧《Win32位程序设计初步之服务》Win32位程序设计初步之服务
    关于我们 | 版权申明 | 广告服务 | 友情链接 | 网站地图 | 使用帮助 | ©2006-2008 TTADD.COM