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

  • 相关阅读:
    HashMap源码分析
    LinkedList源码分析
    ArrayList源码学习
    Java容器知识总结
    Collections 工具类和 Arrays 工具类常见方法
    Java基础知识
    MySQL高级之索引优化分析
    MySQL命令大全
    Java IO
    SpringCloud笔记
  • 原文地址:https://www.cnblogs.com/xieyunc/p/9126528.html
Copyright © 2020-2023  润新知