Delphi如何获取系统服务(即Service服务程序)列表


本文整理自网络,侵删。

 
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;

相关阅读 >>

Delphi基于高斯-拉普拉斯算子的图像边缘检测

Delphi多线程

Delphi xe7开发的直接以管理员模式启动cmd命令行界面

Delphi 将被其他窗体遮住的窗体弹到最前面

Delphi 把单张图片保存到access数据库

Delphi调用http接口方法

Delphi 以bytes为单位获取文件大小

Delphi 通过按键 esc 关闭程序

Delphi防止同时出现多个应用程序实例

Delphi windows的消息传递--消息盒子

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...