当前位置:天才代写 > tutorial > C语言/C++ 教程 > Windows处事编写道理及探讨(1)

Windows处事编写道理及探讨(1)

2017-11-06 08:00 星期一 所属: C语言/C++ 教程 浏览:995

副标题#e#

有那么一类应用措施,是可以或许为各类用户(包罗当地用户和长途用户)所用的,拥有用户授权级举办打点的本领,而且岂论用户是否物理的与正在运行该应用措施的计较机相连都能正常执行,这就是所谓的处事了。

(一)处事的基本常识

Question 1. 什么是处事?它的特征是什么?

在NT/2000中,处事是一类受到操纵系统优待的措施。一个处事首先是一个Win32可执行措施,假如要写一个成果完备且强大的处事,需要熟悉动态毗连库(Dlls)、布局异常处理惩罚、内存映射文件、虚拟内存、设备I/O、线程及其同步、Unicode以及其他的由WinAPI函数提供的应用接口。虽然本文接头的只是成立一个可以安装、运行、启动、遏制的没有任何其他成果的处事,所以无需上述常识仍可以继承看下去,我会在进程中将领略本文所需要的常识逐一讲授。

第二要知道的是一个处事决不需要用户界面。大大都的处事将运行在那些被锁在某些暗中的,冬暖夏凉的小房子里的强大的处事器上面,纵然有用户界面一般也没有人可以看到。假如处事提供任何用户界面如动静框,那么用户错过这些动静的大概性就极高了,所以处事措施凡是以节制台措施的形式被编写,进入点函数是main()而不是WinMain()。

也许有人有疑问:没有用户界面的话,要奈何配置、打点一个处事?奈何开始、遏制它?处事如何发出告诫或错误信息、如何陈诉关于它的执行环境的统计数据?这些问题的谜底就是处事可以或许被长途打点,Windows NT/2000提供了大量的打点东西,这些东西答允通过网络上的其它计较机对某台呆板上面的处事举办打点。好比Windows 2000内里的“节制台”措施(mmc.exe),用它添加“打点单位”就可以打点本机或其他呆板上的处事。


#p#副标题#e#

Question 2. 处事的安详性…

想要写一个处事,就必需熟悉Win NT/2000的安详机制,在上述操纵系统之中,所有安详都是基于用户的。换句话说——历程、线程、文件、注册表键、信号、事件等等等等都属于一个用户。当一个历程被发生的时候,它都是执行在一个用户的上下文(context),这个用户帐号大概在本机,也大概在网络中的其他呆板上,可能是在一个非凡的账号:System Account——即系统帐号的上下文

假如一个历程正在一个用户帐号下执行,那么这个历程就同时拥有这个用户所能拥有的一切会见权限,岂论是在本机照旧网络。系统帐号则是一个非凡的账号,它用来标识系统自己,并且运行在这个帐号下的任何历程都拥有系统上的所有会见权限,可是系统帐号不能在域上利用,无法会见网络资源…

处事也是Win32可执行措施,它也需要执行在一个context,凡是处事都是在系统账号下运行,可是也可以按照环境选择让它运行在一个用户账号下,也就会因此得到相应的会见资源的权限。

Question 3. 处事的三个构成部门

一个处事由三部门构成,第一部门是Service Control Manager(SCM)。每个Windows NT/2000系统都有一个SCM,SCM存在于Service.exe中,在Windows启动的时候会自动运行,陪伴着操纵系统的启动和封锁而发生和终止。这个历程以系统特权运行,而且提供一个统一的、安详的手段去节制处事。它其实是一个RPC Server,因此我们可以长途安装和打点处事,不外这不在本文接头的范畴之内。SCM包括一个储存着已安装的处事和驱动措施的信息的数据库,通过SCM可以统一的、安详的打点这些信息,因此一个处事措施的安装进程就是将自身的信息写入这个数据库。

第二部门就是处事自己。一个处事拥有能从SCM收到信号和呼吁所必须的的非凡代码,而且可以或许在处理惩罚后将它的状态回传给SCM。

#p#副标题#e#

第三部门也就是最后一部门,是一个Service Control Dispatcher(SCP)。它是一个拥有用户界面,答允用户开始、遏制、暂停、继承,而且节制一个或多个安装在计较机上处事的Win32应用措施。SCP的浸染是与SCM通讯,Windows 2000打点东西中的“处事”就是一个典范的SCP。

在这三个构成部门中,用户最大概去写处事自己,同时也大概不得不写一个与其陪伴的客户端措施作为一个SCP去和SCM通讯,本文只接头去设计和实现一个处事,关于如何去实现一个SCP则在今后的其它文章中先容。

Question 4. 奈何开始设计处事

还记得前面我提随处事措施的进口点函数一般都是main()吗?一个处事拥有很重要的三个函数,第一个就是进口点函数,其实用WinMain()作为进口点函数也不是不行以,固然说处事不该该有用户界面,可是其实存在很少的几个破例,这就是下面图中的选项存在的原因。

由于要和用户桌面举办信息交互,处事措施有时会以WinMain()作为进口点函数。

#p#分页标题#e#

进口函数认真初始化整个历程,由这个历程中的主线程来执行。这意味着它应用于这个可执行文件中的所有处事。要知道,一个可执行文件中可以或许包括多个处事以使得执行越发有效。主历程通知SCM在可执行文件中含有几个处事,而且给出每一个处事的ServiceMain回调(Call Back)函数的地点。一旦在可执行文件内的所有处事都已经遏制运行,主线程就在历程终止前对整个历程举办排除。

第二个很重要的函数就是ServiceMain,我看过一些例子措施内里对本身的处事的进入点函数都牢靠数名为ServiceMain,其实并没有划定过必然要那样定名,任何的函数只要切合下列的形式都可以作为处事的进入点函数。

VOID WINAPI ServiceMain(
  DWORD dwArgc, // 参数个数
  LPTSTR *lpszArgv // 参数串
);

#p#副标题#e#

这个函数由操纵系统挪用,并执行能完成处事的代码。一个专用的线程执行每一个处事的ServiceMain函数,留意是处事而不是处事措施,这是因为每个处事也都拥有与本身独一对应的ServiceMain函数,关于这一点可以用“打点东西”里的“处事”去察看Win2000内里自带的处事,就会发明其实许多处事都是由service.exe单独提供的。当主线程挪用Win32函数StartServiceCtrlDispatcher的时候,SCM为这个历程中的每一个处事发生一个线程。这些线程中的每一个都和它的相应的处事的ServiceMain函数一起执行,这就是处事老是多线程的原因——一个仅有一个处事的可执行文件将有一个主线程,其它的线程执行处事自己。

第三个也就是最后的一个重要函数是CtrlHandler,它必需拥有下面的原型:

VOID WINAPI CtrlHandler(
DWORD fdwControl //节制呼吁
)

像ServiceMain一样,CtrlHandler也是一个回调函数,用户必需为它的处事措施中每一个处事写一个单独的CtrlHandler函数,因此假如有一个措施含有两个处事,那么它至少要拥有5个差异的函数:作为进口点的main()或WinMain(),用于第一个处事的ServiceMain函数和CtrlHandler函数,以及用于第二个处事的ServiceMain函数和CtrlHandler函数。

SCM挪用一个处事的CtrlHandler函数去改变这个处事的状态。譬喻,当某个打点员用打点东西里的“处事”实验遏制你的处事的时候,你的处事的CtrlHandler函数将收到一个SERVICE_CONTROL_STOP通知。CtrlHandler函数认真执行遏制处事所需的一切代码。由于是历程的主线程执行所有的CtrlHandler函数,因而必需只管优化你的CtrlHandler函数的代码,使它运行起来足够快,以便沟通历程中的其它处事的CtrlHandler函数能在适当的时间内收到属于它们的通知。并且基于上述原因,你的CtrlHandler函数必需要可以或许将想要转达的状态送随处事线程,这个通报进程没有牢靠的要领,完全取决于你的处事的用途。

本文测试情况为Win2000 Server + SP2

Athlon XP 1700 + 256MB DDR

全部资料参考自MSDN OCT 2001

 

    关键字:

天才代写-代写联系方式