zoukankan      html  css  js  c++  java
  • Delphi获取系统服务描述信息

    program Project1;
    
    {$APPTYPE CONSOLE}
    
    uses
      Windows,
      WinSvc;
    
    type
      SERVICE_DESCRIPTION = packed record
        lpDescription: PWChar;
      end;
      PSERVICE_DESCRIPTION = ^SERVICE_DESCRIPTION;
    
    function QueryServiceConfig2(hService: THandle; dwInfoLevel: DWORD; lpBuffer: Pointer; cbBufSize: DWORD; var pcbBytesNeeded: DWORD): LongBool; stdcall; external 'advapi32.dll' name 'QueryServiceConfig2W';
    
    ////////////////////////////////////////////////////////////////////////////////
    // Procedure : SysErrorMessage
    // Comment : Returns last error as formated string
    
    function SysErrorMessage(ErrorCode: Integer): string;
    var
      Len: Integer;
      Buffer: array[0..55]of Char;
    begin
      Len := FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_ARGUMENT_ARRAY,
                           nil, ErrorCode, 0, Buffer, SizeOf(Buffer), nil);
      while (Len > 0)and(Buffer[Len-1] in [#0..#32, '.']) do Dec(Len);
      SetString(Result, Buffer, Len);
    end;
    
    function GetServiceDesciption(Computer, Servicename: PWChar; var Description: WideString): Boolean;
    var
      sc: THandle;
      os: THandle;
      sd: Boolean;
      dwNeeded: DWORD;
      Buffer: Pointer;
    begin
      dwNeeded := 0;
      Buffer := nil;
      sc := OpenSCManagerW(Computer, nil, SC_MANAGER_CONNECT);
      if sc <> 0 then
      begin
        os := OpenServiceW(sc, Servicename, SERVICE_QUERY_CONFIG);
        if os <> 0 then
        begin
          sd := QueryServiceConfig2(os, 1, nil, 0, dwNeeded);
          if (not sd) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then
          begin
            try
              GetMem(Buffer, dwNeeded);
              result := QueryServiceConfig2(os, 1, Buffer, dwNeeded, dwNeeded);
              if result then
              begin
                Description := PSERVICE_DESCRIPTION(Buffer)^.lpDescription;
              end;
            finally
              FreeMem(Buffer, dwNeeded);
            end;
          end
          else
            result := False;
        end
        else
          result := False;
      end
      else
        result := False;
    end;
    
    var
      description : WideString;
    
    begin
      if not GetServiceDesciption('PC-201212071904', 'AdobeFlashPlayerUpdateSvc', description) then
      begin
        Writeln(SysErrorMessage(GetLastError));
        Readln;
      end
      else
        MessageBoxW(0, PWideChar(description), 'Dienstbeschreibung', 0);
        
    end.

    http://www.lsworks.net/article/97.html

  • 相关阅读:
    Linux 线程间通信方式+进程通信方式 总结
    使用opencv第三方库的makefile文件示例
    rplidar SDK 二次开发---之获取目标信息(0.1)
    #include "Target_orientation.h"
    opencv —— 调用摄像头采集图像 VideoCapture capture(0);
    cmake 支持-lpthread
    ROS下sensor_msgs::ImagePtr到sensor_msgs::Image之间的转换
    JAVA 校验身份证号码工具类(支持15位和18位)
    python面向对象游戏练习:好人坏人手枪手榴弹
    python 私有属性的作用
  • 原文地址:https://www.cnblogs.com/findumars/p/4998879.html
Copyright © 2011-2022 走看看