WindowsNT下Service的编程

2016-02-19 12:39 6 1 收藏

有了下面这个WindowsNT下Service的编程教程,不懂WindowsNT下Service的编程的也能装懂了,赶紧get起来装逼一下吧!

【 tulaoshi.com - 编程语言 】


  ----此例中原程序使用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指定按服务的状态枚举。
  ----参数lpServices指向ENUM_SERVICE_STATUS结构,用于存放返回的服务的名字和状态信息。
  ----参数cbBufSize返回参数lpServices的长度,以字节为单位。
  ----参数pcbBytesNeeded返回获取剩余的Service所需字节的个数。
  ----参数lpServicesReturned返回服务的个数。
  ----参数lpResumeHandle,当第一次调用时该参数为0,当该函数再次被调用以获取另外的信息时,该参数表示下一个被读的Service。
  ----函数返回值:函数执行成功则返回True,失败则返回False。
  ----值得注重的是通常情况下该函数返回的结果为FALSE,我们可以调用GetLastError()来获取进一步信息。因为一台机器上有多种服务存在,所以GetLastError()应为ERROR_MORE_DATA,此时应再次调用EnumServicesStatus函数以获取正确的Service列表。
  
  ----下面有一个用Delphi编的一个程序例子,用其他开发工具如VC,VB也可实现。程序运行时,单击按钮Button1枚举NT中的Service并显示在列表框ListBox1中。在ListBox1选中某个Service,单击按钮Button2则启动该Service,单击按钮Button3则停止该Service。
  
  首先在Unit1.hpp中添加
  #include winsvc.hpp
  然后在Class Form1的Private中添加
  
  SC_HANDLE hscmanager,hService;
  TServiceStatus returnstatus;
  
  以下是Unit1.cpp的内容:
  /************

来源:http://www.tulaoshi.com/n/20160219/1601440.html

延伸阅读
----科学计算可视化,计算机动画和虚拟现实是现在计算机图形学的三个热点。而这三个热点的核心都是三维真实感图形的绘制。由于OpenGL( OpenGraphicsLibrary)具有跨平台性、简便、高效、功能完善,目前已经成为了三维图形制作方法中事实上的工业标准。自从WindowsNT3.51在微 机平台上支持OpenGL以后,现在微软公司在Windows95OS...
Web Service随笔。 1 为什么出现Web Service?现在Internet的发展十分迅速,它从前的框架是“人来获取网络上的资源,比如:程序、文档等”。也就是说,现在的Web是以人为中心的,人来发送各种请求。而它的发展趋势将是主体从“人”转向“程序”,比如媒体播放器、浏览器等,也就是说“以应用程序中心”...
标签: Web开发
c# JSON返回格式的WEB SERVICEhttp://www.jb51.net/article/16768.htm 我这里是利用axis创建类包的,首先下载axis的压缩包,然后解压,把axis放到webapp下面。如果可以运行,就OK了。   c#创建的webservice自带的wsdl的,直接可以加上?wsdl访问,然后利用axis生成类: java -classpath ".;commons-logging.jar;axis.jar;co...
Web service到底是什么;在什么情况下你应该使用Web service。 分布式应用程序和浏览器 研究一下当前的应用程序开发,你会发现一个绝对的倾向:人们开始偏爱基于浏览器的瘦客户应用程序。这当然不是因为瘦客户能够提供更好的用户界面,而是因为它能够避免花在桌面应用程序发布上的高成本。发布桌面应用程序成本很高,一半是因为应用程序安装和...
在安卓操作系统下对于 TextView 字体的支持非常有限,默认情况下 TextView 的 typeface 属性支持 "Sans","serif","monospace" 这三种字体,如果在没有指定字体的情况下,系统缺省会使用 "Sans" 作为文本显示的字体。但这三种字体只支持英文,也就是说只要你显示的文字是中文,无论你选择这三种字体中的哪一种,显示效果都是一样的。为此,谷歌...

经验教程

369

收藏

38
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部