WindowsNT下Service的编程

2008-02-23 05:38:51来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

----此例中原程式使用Delphi编制,老妖将之改成CB版。:D

----WindowsNTServer提供多种功能强大的服务(Service),例如FTP,WWW或远程登录服务,另外常用的数据库服务器也是以Service的形式存在于NTServer上的,如Sybase SQLServer For NT。Service一般在NT启动时自动启动,在NT关机时停止。但是有时用户可能想手工启动、暂停、停止某项Service,这就需要在控制面板中进行配置,对于不太熟悉NT的用户来说比较困难;对于软件研发人员,有时需要在软件中访问和操作某项Service,甚至可能需要研发新Service的提供给用户使用。上面两种情况都能够通过对Service的编程来解决。对Service的编程涉及到NT的内核,比较复杂且相关资料较少,给软件研发人员带来很多困难,笔者通过对WindowsNT的API的分析找到了相应的编程方法,再此介绍给大家。

----在WindowsNT下,各种Service都存在service control manager database中,因此我们能够通过对service control manager database进行操作来实现对Service的编程。下面介绍常用的函数:

1:SC_HANDLE OpenSCManager(LPCTSTR lpszMachineName,LPCTSTR lpszDatabaseName,DWORD fdwDesiredAccess);

----Open SCManager 函数打开指定电脑上的service control manager database。其中参数lpszMachineName指定电脑名,若为空则指定为本机。参数lpszDatabaseName指定要打开的service control manager database,默认为空。

----参数fdwDesiredAccess指定操作的权限,能够为下面取值之一

SC_MANAGER_ALL_ACCESS //任何权限
SC_MANAGER_CONNECT //允许连接service control manager
SC_MANAGER_CREATE_SERVICE //允许创建服务对象并把他加入service control manager database
SC_MANAGER_ENUMERATE_SERVICE //允许枚举service control manager database中的服务
SC_MANAGER_LOCK //允许锁住service control manager database
SC_MANAGER_QUERY_LOCK_STATUS //允许获取servicecontrolmanagerdatabase的封锁信息

----函数返回值:函数执行成功则返回一个指向service control manager database的句柄,失败则返回NULL。

2:SC_HANDLE OpenService(SC_HANDLE schSCManager,LPCTSTR lpszServiceName,DWORD fdwDesiredAccess);

----OpenService函数打开指定的Service。
----其中参数schSCManager是指向service control manager database的句柄,由OpenSCManager函数返回。
----参数lpszServiceName要打开的服务的名字,注意大小写。
----参数fdwDesiredAccess指定操作的权限,能够为下面取值之一

SERVICE_ALL_ACCESS //任何权限
SERVICE_CHANGE_CONFIG //允许更改服务的配置
SERVICE_ENUMERATE_DEPENDENTS //允许获取依赖于该服务的其他服务
SERVICE_INTERROGATE //允许立即获取服务状态
SERVICE_PAUSE_CONTINUE //允许暂停和唤醒服务
SERVICE_QUERY_CONFIG //允许获取服务配置
SERVICE_QUERY_STATU //允许通过访问service control manager获取服务状态
SERVICE_START //允许启动服务
SERVICE_STOP //允许停止服务
SERVICE_USER_DEFINE_CONTROL //允许用户指定特别的服务控制码


----函数返回值:函数执行成功则返回指向某项服务的句柄,失败则返回NULL。

3:BOOL QueryServiceStatus(SC_HANDLE schService,LPSERVICE_STATUS lpssServiceStatus);

----QueryServiceStatus函数返回指定服务的当前状态。
----其中参数schService是指向某项服务的句柄,由OpenService函数返回,且必须SERVICE_QUERY_STATUS的权限。
----参数lpssServiceStatus中存放返回的服务状态信息,结构如下
typedefstruct_SERVICE_STATUS
{
DWORD dwServiceType; //服务类型
DWORD dwCurrentState; //当前状态
DWORD dwControlsAccepted; //服务可接受的控制码
DWORD dwWin32ExitCode; //Win32出错代码
DWORD dwServiceSpecificExitCode;//服务出错代码
DWORD dwCheckPoint; //用于跟踪服务长时间操作
DWORD dwWaitHint; //服务某一操作的最大允许时间,以毫秒为单位
}SERVICE_STATUS,*LPSERVICE_STATUS;

----函数返回值:函数执行成功则返回True,失败则返回False。

4:BOOLStartService(SC_HANDLE schService,DWORD dwNumServiceArgs,LPCTSTR * lpszServiceArgs);

----StartService函数启动指定的服务。
----其中参数schService是指向某项服务的句柄,由OpenService函数返回,且必须有SERVICE_START的权限。
----dwNumServiceArgs为启动服务所需的参数的个数。
----lpszServiceArgs为启动服务所需的参数。函数返回值:函数执行成功则返回True,失败则返回False。

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

----ControlService函数向Win32service发送控制码。
----其中参数hService是指向某项服务的句柄,由OpenService函数返回。
----参数dwControl为控制码,常用的有
SERVICE_CONTROL_STOP //停止服务
SERVICE_CONTROL_PAUSE //暂停服务
SERVICE_CONTROL_CONTINUE //唤醒暂停的服务
SERVICE_CONTROL_INTERROGATE//刷新某服务的状态
----参数lpServiceStatus指向SERVICE_STATUS结构,用于存放该服务最新的状态信息。
----函数返回值:函数执行成功则返回True,失败则返回False。

6:BOOL EnumServicesStatus(SC_HANDLE hSCManager,DWORD dwServiceType,DWORD dwServiceState,LPENUM_SERVICE_STATUS lpServices,DWORD cbBufSize,LPDWORD pcbBytesNeeded,LPDWORD lpServicesReturned,LPDWORD lpResumeHandle);

----EnumServicesStatus函数用于枚举NT下存在的Service。
----其中参数hSCManager是指向service control manager database的句柄,由OpenSCManager函数返回,且必须有SC_MANAGER_ENUMERATE_SERVICE的权限。
----参数dwServiceType指定按服务的类型枚举。
----参数dwServiceState指定按服务的状态枚举。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 让程式在前端显示和最小化时在系统栏里

下一篇: 如何监控剪贴板