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;