用C++ Builder在WINNT下编制一个Service

Windows NT与Windows 9x有一个非常重要的区别,即Windows NT提供了很多功能强大的Service(服务)。这些Service可以随着NT的启动而自启动,也可以让用户通过控制面板启动,还可以被Win32应用程序起停。甚至在没有用户登录系统的情况下,这些Service也能执行。许多FTP、WWW服务器和数据库就是以Service的形式存在于NT上,从而实现了无人值守。就连最新版的“黑客”程序Back Orifice 2000也是以Service形式在NT上藏身的。由于Service的编程较复杂,许多开发者想开发自己的Service但往往都望而却步。鉴于此,下面我们就从头到尾来构造一个全新的Service,读者只要在程序中注明的地方加上自己的代码,那么就可以轻松拥有一个自己的Service。在编写Service之前,先介绍一下几个重要的函数:

1. SC_HANDLE OpenSCManager( LPCTSTR lpMachineName, LPCTSTR lpDatabaseName, DWORD dwDesiredAccess)

OpenSCManager 函数打开指定计算机上的service control manager database。其中参数lpMachineName指定计算机名,若为空则指定为本机。LpDatabaseName为指定要打开的service control manager database名, 默认为空。dwDesiredAccess指定操作的权限, 可以为下面取值之一:

SC_MANAGER_ALL_ACCESS //所有权限

SC_MANAGER_CONNECT //允许连接到service control manager database

SC_MANAGER_CREATE_SERVICE //允许创建服务对象并把它加入database

SC_MANAGER_ENUMERATE_SERVICE //允许枚举database 中的Service

SC_MANAGER_LOCK //允许锁住database

SC_MANAGER_QUERY_LOCK_STATUS //允许查询database的封锁信息

函数执行成功则返回一个指向service control manager database的句柄,失败则返回NULL。注意:WINNT通过一个名为service control manager database的数据库来管理所有的Service,因此对Service的任何操作都应打开此数据库。

2. SC_HANDLE CreateService(SC_HANDLE hSCManager,

LPCTSTR lpServiceName,

LPCTSTR lpDisplayName,

DWORD dwDesiredAccess,

DWORD dwServiceType,

DWORD dwStartType,

DWORD dwErrorControl,

LPCTSTR lpBinaryPathName,

LPCTSTR lpLoadOrderGroup,

LPDWORD lpdwTagId,

LPCTSTR lpDependencies,

LPCTSTR lpServiceStartName,

LPCTSTR lpPassword)

CreatService函数产生一个新的SERVICE。其中参数hSCManager为指向service control manager database 的句柄,由OpenSCManager返回。LpServiceName为SERVICE的名字,lpDisplayName为Service显示用名,dwDesiredAccess是访问权限,本程序中用SERVICE_ALL_ACCESS。wServiceType,指明SERVICE类型,本程序中用SERVICE_WIN32_OWN_PROCESS| SERVICE_INTERACTIVE_PROCESS。dwStartType为Service启动方式,本程序采用自启动,即dwStartType等于SERVICE_AUTO_START。 dwErrorControl说明当Service在启动中出错时采取什么动作,本程序采用SERVICE_ERROR_IGNORE即忽约错误,读者可以改为其他的。LpBinaryPathName指明Service本体程序的路径名。剩下的五个参数一般可设为NULL。如函数调用成功则返回这个新Service的句柄,失败则返回NULL。与此函数对应的是DeleteService( hService),它删除指定的Service。

3. SC_HANDLE OpenService(SC_HANDLE hSCManager,LPCTSTR lpServiceName, DWORD dwDesiredAccess )

OpenService函数打开指定的Service。其中参数hSCManager为指向service control manager database 的句柄,由OpenSCManager返回。LpServiceName为Service的名字,dwDesiredAccess是访问权限,其可选值比较多,读者可以参看SDK Help. 函数调用成功则返回打开的Service句柄,失败则返回NULL。

4. BOOL StartService( SC_HANDLE hService, DWORD dwNumServiceArgs,LPCTSTR *lpServiceArgVectors )

StartService函数启动指定的Service。其中参数hService 为指向Service的句柄,由OpenService返回。dwNumServiceAr为启动服务所需的参数的个数。lpszServiceArgs 为 启 动 服务所需的参数。函数执行成功则返回True, 失败则返回False。

5. BOOL ControlService(SC_HANDLE hService DWORD dwControl,LPSERVICE_STATUS lpServiceStatus )

Service程序没有专门的停止函数,而是用ControlService函数来控制Service的暂停、继续、停止等操作。参数dwControl指定发出的控制命令,可以为以下几个值:

SERVICE_CONTROL_STOP //停止Service

SERVICE_CONTROL_PAUSE //暂停Service

SERVICE_CONTROL_CONTINUE //继续Service

SERVICE_CONTROL_INTERROGATE //查询Service的状态

SERVICE_CONTROL_SHUTDOWN //让ControlService调用失效

参数lpServiceStatus是一个指向SERVICE_STATUS的指针。SERVICE_STATUS是一个比较重要的结构,它包含了Service的各种信息,如当前状态、可接受何种控制命令等等。

时间: 2016-12-11

用C++ Builder在WINNT下编制一个Service的相关文章

WinNT下Service的编制

Windows NT与Windows 9x有一个非常重要的区别,即Windows NT提供了很多功能强大的Service(服务).这些Service可以随着NT的启动而自启动,也可以让用户通过控制面板启动,还可以被Win32应用程序起停.甚至在没有用户登录系统的情况下,这些Service也能执行.许多FTP.WWW服务器和数据库就是以Service的形式存在于NT上,从而实现了无人值守.就连最新版的"黑客"程序Back Orifice 2000也是以Service形式在NT上藏身的.由

C++Builder在WIN2000环境下编制Service

Windows 2000与Windows 9x有一个非常重要的区别,即Windows 2000提供了很多功能强大的Service(服务).这些Service可以随着WIN2000的启动而自启动,也可以让用户通过控制面板启动,还可以被Win32应用程序起停.甚至在没有用户登录系统的情况下,这些Service也能执行.许多FTP.WWW服务器和数据库就是以Service的形式存在于WIN2000上,从而实现了无人值守.就连最新版的"黑客"程序Back Orifice 2000也是以Serv

Flash Builder 4.5下新建Flex+java 项目 遇到问题?

问题描述 我在Flash Builder 4.5下新建Flex+java 项目,总是不成功,点击"完成" 弹出 如下错误信息:创建项目时遇到错误.原因:One or more constraints have not been satisfied. 有人遇到过这个问题嘛?   问题补充:<div class="quote_title">suziwen 写道</div><div class="quote_div">

openni opencv linux-如何在linux下建立一个着openni和opencv的工程?

问题描述 如何在linux下建立一个着openni和opencv的工程? 如何在linux下建立一个着openni和opencv的工程?麻烦大神们详细解说下,不胜感激!!!!

php- js在不跳转的情况下向一个页面传递参数

问题描述 js在不跳转的情况下向一个页面传递参数 需求是把textarea传递到savexml.php进行数据保存,但同时我希望页面还留着当前页面.代码如下: <form name=""form1"" id=""form1"" method=""post"" action=""newtest.php""> <input type=

!important在ie6下的一个BUG和CSS的优先级。

在没有DTD的声明的情况下,在同一个选择器样式(即同一个大括号里面)下,IE6,IE7,IE8对!important的解析都是无效的. 一 css的优先级 今天有人跟我说css hack中用!important来区分ie6,因为ie6不支持!important,是的在很早以前我也是用过这种方法写hack,但是后来就基本不用了.本来我对他谁的ie6不支持!important也没什么异议,可是正好在前几天正好用个这个!important属性解决了一个样式优先级的问题,而且是支持ie6的,这是为什么呢

运用C#创建一个.Net下的Web Service

web|创建 微软在其.net战略中,对其主推的Web Service做了大肆的宣扬.现在,Web Service正如火如荼地发展着,相关的各项新技术层出不穷.Web Service的发展正构筑着互联网时代美好的明天.在本文中,我将向大家介绍Web Service的一些基本知识.如何用C#建立一个Web Service.通过文章,我们还将对WSDL.UDDI以及未来的Web Service有一个大致的了解. 为什么需要Web Service? 以前,分布式的应用程序逻辑需要使用分布式的对象模型,

Android下写一个永远不会被KILL掉的进程/服务

  Android 系统对于内存管理有自己的一套方法,为了保障系统有序稳定的运信,系统内部会自动分配,控制程序的内存使用.当系统觉得当前的资源非常有限的时候,为了保证一些优先级高的程序能运行,就会杀掉一些他认为不重要的程序或者服务来释放内存.这样就能保证真正对用户有用的程序仍然再运行.如果你的 Service 碰上了这种情况,多半会先被杀掉.但如果你增加 Service 的优先级就能让他多留一会,我们可以用 setForeground(true) 来设置 Service 的优先级.   为什么是

linux驱动-在linux kernel3.13环境下编写一个模块用netfilter来过滤IP地址

问题描述 在linux kernel3.13环境下编写一个模块用netfilter来过滤IP地址 在linux kernel3.13环境下编写一个模块用netfilter来过滤IP地址,其中想在模块中打开存在磁盘上的ip.txt文档读入需要过滤的IP,但是用来filp_open()打开文件总是失败,按照网上说的get_fs;set_fs;get_fs;却依然失败,且每次插进内核都会造成系统崩溃,请大侠帮助