WinSvcEx.pas
上传用户:sinothink
上传日期:2022-07-15
资源大小:459k
文件大小:6k
源码类别:

远程控制编程

开发平台:

Delphi

  1. {------------------------------------------------------------------------------
  2.   WinSvcEx v1.0 beta
  3.  ------------------------------------------------------------------------------
  4.   Copyright 2002 by GSC.
  5.  ------------------------------------------------------------------------------
  6.   With this unit you may use the new function introduced in Windows 2000 for
  7.   service handling.
  8.   The unit loads the requied functions dynamic so you get a nil pointer
  9.   if the running system is not NT or older than Windows 2000.
  10.   Look at the end of this file for code.
  11.   Prototypes converted from WinSvc.h of "Microsoft Platform SDK, 2000 June".
  12.   Module load code from ZeosLib.
  13.   Please send me feedback or buginfo to info@gsc.hu. Subject to type: WinSvcEx
  14.  ------------------------------------------------------------------------------
  15.   Date last modified: Jun 03, 2002
  16.  ------------------------------------------------------------------------------
  17. }
  18. unit WinSvcEx;
  19. interface
  20. uses Windows, WinSvc;
  21. const
  22. //
  23. // Service config info levels
  24. //
  25.   SERVICE_CONFIG_DESCRIPTION     = 1;
  26.   SERVICE_CONFIG_FAILURE_ACTIONS = 2;
  27. //
  28. // DLL name of imported functions
  29. //
  30.   AdvApiDLL = 'advapi32.dll';
  31. type
  32. //
  33. // Service description string
  34. //
  35.   PServiceDescriptionA = ^TServiceDescriptionA;
  36.   PServiceDescriptionW = ^TServiceDescriptionW;
  37.   PServiceDescription = PServiceDescriptionA;
  38.   {$EXTERNALSYM _SERVICE_DESCRIPTIONA}
  39.   _SERVICE_DESCRIPTIONA = record
  40.     lpDescription : PAnsiChar;
  41.   end;
  42.   {$EXTERNALSYM _SERVICE_DESCRIPTIONW}
  43.   _SERVICE_DESCRIPTIONW = record
  44.     lpDescription : PWideChar;
  45.   end;
  46.   {$EXTERNALSYM _SERVICE_DESCRIPTION}
  47.   _SERVICE_DESCRIPTION = _SERVICE_DESCRIPTIONA;
  48.   {$EXTERNALSYM SERVICE_DESCRIPTIONA}
  49.   SERVICE_DESCRIPTIONA = _SERVICE_DESCRIPTIONA;
  50.   {$EXTERNALSYM SERVICE_DESCRIPTIONW}
  51.   SERVICE_DESCRIPTIONW = _SERVICE_DESCRIPTIONW;
  52.   {$EXTERNALSYM SERVICE_DESCRIPTION}
  53.   SERVICE_DESCRIPTION = _SERVICE_DESCRIPTIONA;
  54.   TServiceDescriptionA = _SERVICE_DESCRIPTIONA;
  55.   TServiceDescriptionW = _SERVICE_DESCRIPTIONW;
  56.   TServiceDescription = TServiceDescriptionA;
  57. //
  58. // Actions to take on service failure
  59. //
  60.   {$EXTERNALSYM _SC_ACTION_TYPE}
  61.   _SC_ACTION_TYPE = (SC_ACTION_NONE, SC_ACTION_RESTART, SC_ACTION_REBOOT, SC_ACTION_RUN_COMMAND);
  62.   {$EXTERNALSYM SC_ACTION_TYPE}
  63.   SC_ACTION_TYPE = _SC_ACTION_TYPE;
  64.   PServiceAction = ^TServiceAction;
  65.   {$EXTERNALSYM _SC_ACTION}
  66.   _SC_ACTION = record
  67.     aType : SC_ACTION_TYPE;
  68.     Delay : DWORD;
  69.   end;
  70.   {$EXTERNALSYM SC_ACTION}
  71.   SC_ACTION = _SC_ACTION;
  72.   TServiceAction = _SC_ACTION;
  73.   PServiceFailureActionsA = ^TServiceFailureActionsA;
  74.   PServiceFailureActionsW = ^TServiceFailureActionsW;
  75.   PServiceFailureActions = PServiceFailureActionsA;
  76.   {$EXTERNALSYM _SERVICE_FAILURE_ACTIONSA}
  77.   _SERVICE_FAILURE_ACTIONSA = record
  78.     dwResetPeriod : DWORD;
  79.     lpRebootMsg : LPSTR;
  80.     lpCommand : LPSTR;
  81.     cActions : DWORD;
  82.     lpsaActions : ^SC_ACTION;
  83.   end;
  84.   {$EXTERNALSYM _SERVICE_FAILURE_ACTIONSW}
  85.   _SERVICE_FAILURE_ACTIONSW = record
  86.     dwResetPeriod : DWORD;
  87.     lpRebootMsg : LPWSTR;
  88.     lpCommand : LPWSTR;
  89.     cActions : DWORD;
  90.     lpsaActions : ^SC_ACTION;
  91.   end;
  92.   {$EXTERNALSYM _SERVICE_FAILURE_ACTIONS}
  93.   _SERVICE_FAILURE_ACTIONS = _SERVICE_FAILURE_ACTIONSA;
  94.   {$EXTERNALSYM SERVICE_FAILURE_ACTIONSA}
  95.   SERVICE_FAILURE_ACTIONSA = _SERVICE_FAILURE_ACTIONSA;
  96.   {$EXTERNALSYM SERVICE_FAILURE_ACTIONSW}
  97.   SERVICE_FAILURE_ACTIONSW = _SERVICE_FAILURE_ACTIONSW;
  98.   {$EXTERNALSYM SERVICE_FAILURE_ACTIONS}
  99.   SERVICE_FAILURE_ACTIONS = _SERVICE_FAILURE_ACTIONSA;
  100.   TServiceFailureActionsA = _SERVICE_FAILURE_ACTIONSA;
  101.   TServiceFailureActionsW = _SERVICE_FAILURE_ACTIONSW;
  102.   TServiceFailureActions = TServiceFailureActionsA;
  103. ///////////////////////////////////////////////////////////////////////////
  104. // API Function Prototypes
  105. ///////////////////////////////////////////////////////////////////////////
  106.   TQueryServiceConfig2 = function (hService : SC_HANDLE; dwInfoLevel : DWORD; lpBuffer : pointer;
  107.     cbBufSize : DWORD; var pcbBytesNeeded) : BOOL; stdcall;
  108.   TChangeServiceConfig2 = function (hService : SC_HANDLE; dwInfoLevel : DWORD; lpInfo : pointer) : BOOL; stdcall;
  109. var
  110.   hDLL : THandle ;
  111.   LibLoaded : boolean ;
  112. var
  113.   OSVersionInfo : TOSVersionInfo;
  114.   {$EXTERNALSYM QueryServiceConfig2A}
  115.   QueryServiceConfig2A : TQueryServiceConfig2;
  116.   {$EXTERNALSYM QueryServiceConfig2W}
  117.   QueryServiceConfig2W : TQueryServiceConfig2;
  118.   {$EXTERNALSYM QueryServiceConfig2}
  119.   QueryServiceConfig2 : TQueryServiceConfig2;
  120.   {$EXTERNALSYM ChangeServiceConfig2A}
  121.   ChangeServiceConfig2A : TChangeServiceConfig2;
  122.   {$EXTERNALSYM ChangeServiceConfig2W}
  123.   ChangeServiceConfig2W : TChangeServiceConfig2;
  124.   {$EXTERNALSYM ChangeServiceConfig2}
  125.   ChangeServiceConfig2 : TChangeServiceConfig2;
  126. implementation
  127. initialization
  128.   OSVersionInfo.dwOSVersionInfoSize := SizeOf(OSVersionInfo);
  129.   GetVersionEx(OSVersionInfo);
  130.   if (OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT) and (OSVersionInfo.dwMajorVersion >= 5) then
  131.     begin
  132.       if hDLL = 0 then
  133.         begin
  134.           hDLL:=GetModuleHandle(AdvApiDLL);
  135.           LibLoaded := False;
  136.           if hDLL = 0 then
  137.             begin
  138.               hDLL := LoadLibrary(AdvApiDLL);
  139.               LibLoaded := True;
  140.             end;
  141.         end;
  142.       if hDLL <> 0 then
  143.         begin
  144.           @QueryServiceConfig2A  := GetProcAddress(hDLL, 'QueryServiceConfig2A');
  145.           @QueryServiceConfig2W  := GetProcAddress(hDLL, 'QueryServiceConfig2W');
  146.           @QueryServiceConfig2   := @QueryServiceConfig2A;
  147.           @ChangeServiceConfig2A := GetProcAddress(hDLL, 'ChangeServiceConfig2A');
  148.           @ChangeServiceConfig2W := GetProcAddress(hDLL, 'ChangeServiceConfig2W');
  149.           @ChangeServiceConfig2  := @ChangeServiceConfig2A;
  150.         end;
  151.     end
  152.     else
  153.     begin
  154.       @QueryServiceConfig2A := nil;
  155.       @QueryServiceConfig2W := nil;
  156.       @QueryServiceConfig2 := nil;
  157.       @ChangeServiceConfig2A := nil;
  158.       @ChangeServiceConfig2W := nil;
  159.       @ChangeServiceConfig2  := nil;
  160.     end;
  161. finalization
  162.   if (hDLL <> 0) and LibLoaded then
  163.     FreeLibrary(hDLL);
  164. end.