WindowsNT下Service的编程 |
----此例中原程序使用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 SC_MANAGER_CREATE_SERVICE SC_MANAGER_ENUMERATE_SERVICE //允许枚举service control manager database中的服务 SC_MANAGER_LOCK SC_MANAGER_QUERY_LOCK_STATUS //允许获取servicecontrolmanagerdat ----函数返回值:函数执行成功则返回一个指向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_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 { }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为控制码,常用的有 |