procedure TDpModel.ServiceNames(Names: TStrings; DisplayNames: TStrings = nil;
const Service_Type: integer = $30; const Computer: PChar = nil);
{
返回系统服务列表,Names:用于接收返回的服务名称列表,
DisplayName:用于接收返回的对应显示名称列表,
uType:需要返回那些类型服务名称列表,可以为SERVICE_DRIVER,SERVICE_WIN32,SERVICE_ALL
}
type
TEnumServices = array[0..0] of TEnumServiceStatus; //windows API结构体
PEnumServices = ^TEnumServices; //声明类指针
var
SCM: SC_Handle;
Services: PEnumServices; //定义结构体
Len: Cardinal; //无符号32位整数 ,取值0到4294967295范围。
ServiceCount, ResumeHandle, i: Cardinal;
begin
ResumeHandle := 0;
//建立了一个连接到服务控制管理器的句柄,并打开指定的数据库。
SCM := OpenSCManager(Computer, nil, SC_MANAGER_ALL_ACCESS);
{
Computer:计算机标示指针,如果该指针为NULL ,或者如果它指向一个空字符串,
则连接到本地计算机上的服务控制管理器。
nil:如果该指针为NULL ,默认打开ServicesActive数据库。
SC_MANAGER_ALL_ACCESS:指定访问服务的权限。
}
Len := 0;
ServiceCount := 0;
Services := nil;
try
Names.BeginUpdate;
//判断DisplayNames是否为空
if Assigned(DisplayNames) then DisplayNames.BeginUpdate;
if SCM <> 0 then
begin
//枚举当前系统服务,详见MSDN
EnumServicesStatus(SCM, SERVICE_DRIVER or SERVICE_WIN32, SERVICE_STATE_ALL,
Services[0], 0, Len, ServiceCount, ResumeHandle);
GetMem(Services, Len);
EnumServicesStatus(SCM, SERVICE_DRIVER or SERVICE_WIN32, SERVICE_STATE_ALL,
Services[0], Len, Len, ServiceCount, ResumeHandle);
//Tstring赋值
Names.Add(IntToStr(ServiceCount));
//循环遍历服务
for i := 0 to ServiceCount - 1 do
begin
Names.Add(Services[i].lpServiceName);
if Assigned(DisplayNames) then
begin
DisplayNames.Add(Services[i].lpDisplayName);
end;
end;
FreeMem(Services);
end;
finally
Names.EndUpdate;
if Assigned(DisplayNames) then DisplayNames.EndUpdate;
CloseServiceHandle(SCM);
end;
end;
转载于:https://www.cnblogs.com/xieyunc/p/9126528.html