当前位置:天才代写 > tutorial > C语言/C++ 教程 > WindowsNT下Service编程

WindowsNT下Service编程

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

副标题#e#

—-此例华夏措施利用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


#p#副标题#e#

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。

#p#副标题#e#

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);

#p#副标题#e#

—-ControlService函数向Win32service发送节制码。

—-个中参数hService是指向某项处事的句柄,由OpenService函数返回。

—-参数dwControl为节制码,常用的有

SERVICE_CONTROL_STOP   //遏制处事

SERVICE_CONTROL_PAUSE  //暂停处事

SERVICE_CONTROL_CONTINUE  //叫醒暂停的处事

SERVICE_CONTROL_INTERROGATE//刷新某处事的状态

—-参数lpServiceStatus指向SERVICE_STATUS布局,用于存放该处事最新的状态信息。

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

#p#分页标题#e#

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。

#p#副标题#e#

—-函数返回值:函数执行乐成则返回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的内容:

/**************************************************************************
* 列举NT系统当处事并启动或终止之。
* Edited by 黑山老妖
* 2002.8.9
****************************************************************************/
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DWORD BytesNeeded,serviceReturned,resumeHandle;
bool returnflag;
TEnumServiceStatus lpservice[100];
TEnumServiceStatus service;
DWORD i,bytes;
ListBox1->Items->Clear();
returnflag=false;
resumeHandle=0;
hscmanager=OpenSCManager(NULL,NULL,SC_MANAGER_ENUMERATE_SERVICE);//打开service control manager database
if (hscmanager<0)
  {
  ShowMessage("无法打开service control manager database");
  return;
  }
returnflag=EnumServicesStatus(hscmanager,SERVICE_DRIVER,SERVICE_ACTIVE,&service,sizeof(service),&BytesNeeded,&serviceReturned,&resumeHandle);//列举Service
if(!returnflag&&GetLastError()==ERROR_MORE_DATA)
  {
  bytes=BytesNeeded+sizeof(TEnumServiceStatus);
  EnumServicesStatus(hscmanager,SERVICE_DRIVER,SERVICE_ACTIVE,&lpservice[0],bytes,&BytesNeeded,&serviceReturned,&resumeHandle);
  for(i=0;i<serviceReturned-1;i++)
   {
   ListBox1->Items->Add(lpservice[i].lpServiceName);
   }
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int i;
for(i=0;i<ListBox1->Items->Count;i++)
  {
  if(ListBox1->Selected[i])
   {
   hService=OpenService(hscmanager,PChar(ListBox1->Items->Strings[i].c_str()),SERVICE_ALL_ACCESS);//打开该Service
   if(hService<0)
    {
    ShowMessage("无法打开该处事!");
    return;
    }
   QueryServiceStatus(hService,&returnstatus);//查察该Service的状态
   if(returnstatus.dwCurrentState==SERVICE_STOPPED)//假如该Service已遏制则启动它
   //SERVICE_STOPPED==1,SERVICE_RUNNING==4 老妖注。
    {
    if(StartService(hService,0,NULL))
     ShowMessage("启动乐成!");
    else
     ShowMessage("无法启动该处事!");
    }
   CloseServiceHandle(hService);//封锁该Service
   }
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
int i;
for(i=0;i<ListBox1->Items->Count;i++)
  {
  if(ListBox1->Selected[i])
   {
   hService=OpenService(hscmanager,PChar(ListBox1->Items->Strings[i].c_str()),SERVICE_ALL_ACCESS);//打开该Service
   if(hService<0)
    {
    ShowMessage("无法打开该Service");
    return;
    }
   QueryServiceStatus(hService,&returnstatus);//查察该Service的状态
   if(returnstatus.dwCurrentState==SERVICE_RUNNING) //假如该Service正在运行则遏制它
    {
    if(ControlService(hService,SERVICE_CONTROL_STOP,&returnstatus))
     ShowMessage("乐成遏制!");
    else
     ShowMessage("无法遏制该处事!");
    }
   CloseServiceHandle(hService);//封锁该Service
   }
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
CloseServiceHandle(hscmanager);//封锁service control manager database    
}
//---------------------------------------------------------------------------

 

    关键字:

天才代写-代写联系方式