----参数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的内容:
/**************************************************************************
* 枚举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
}
//---------------------------------------------------------------------------




