- 註冊時間
 - 2006-3-13 
 - 最後登錄
 - 2025-7-23 
 - 在線時間
 - 675 小時 
 - 閱讀權限
 - 200 
 - 積分
 - 417 
 - 帖子
 - 1109 
 - 精華
 - 0 
 - UID
 - 2 
  
 
 
 
    
 | 
(4)关于安装服务如何添加服务描述.有两种方法:一是修改注册表.服务的详细信息都位于HKEY_LOCAL_MACHINE\SYSTEM\ ControlSet001\Services\下面,例如我们刚才那个服务就位于HKEY_LOCAL_MACHINE\SYSTEM\ ControlSet001\Services\DelphiService下.第二种方法就是先用QueryServiceConfig2函数获取服务信息,然后ChangeServiceConfig2来改变描述.用Delphi实现的话,单元如下: 
 
- unit WinSvcEx;
 
  
- interface
 
  
- uses Windows, WinSvc;
 
  
- const
 
 - //
 
 - // Service config info levels
 
 - //
 
 - SERVICE_CONFIG_DESCRIPTION = 1;
 
 - SERVICE_CONFIG_FAILURE_ACTIONS = 2;
 
 - //
 
 - // DLL name of imported functions
 
 - //
 
 - AdvApiDLL = advapi32.dll;
 
 - type
 
 - //
 
 - // Service description string
 
 - //
 
 - PServiceDescriptionA = ^TServiceDescriptionA;
 
 - PServiceDescriptionW = ^TServiceDescriptionW;
 
 - PServiceDescription = PServiceDescriptionA;
 
 - {$EXTERNALSYM _SERVICE_DESCRIPTIONA}
 
 - _SERVICE_DESCRIPTIONA = record
 
 - lpDescription : PAnsiChar;
 
 - end;
 
 - {$EXTERNALSYM _SERVICE_DESCRIPTIONW}
 
 - _SERVICE_DESCRIPTIONW = record
 
 - lpDescription : PWideChar;
 
 - end;
 
 - {$EXTERNALSYM _SERVICE_DESCRIPTION}
 
 - _SERVICE_DESCRIPTION = _SERVICE_DESCRIPTIONA;
 
 - {$EXTERNALSYM SERVICE_DESCRIPTIONA}
 
 - SERVICE_DESCRIPTIONA = _SERVICE_DESCRIPTIONA;
 
 - {$EXTERNALSYM SERVICE_DESCRIPTIONW}
 
 - SERVICE_DESCRIPTIONW = _SERVICE_DESCRIPTIONW;
 
 - {$EXTERNALSYM SERVICE_DESCRIPTION}
 
 - SERVICE_DESCRIPTION = _SERVICE_DESCRIPTIONA;
 
 - TServiceDescriptionA = _SERVICE_DESCRIPTIONA;
 
 - TServiceDescriptionW = _SERVICE_DESCRIPTIONW;
 
 - TServiceDescription = TServiceDescriptionA;
 
  
- //
 
 - // Actions to take on service failure
 
 - //
 
 - {$EXTERNALSYM _SC_ACTION_TYPE}
 
 - _SC_ACTION_TYPE = (SC_ACTION_NONE, SC_ACTION_RESTART, SC_ACTION_REBOOT, SC_ACTION_RUN_COMMAND);
 
 - {$EXTERNALSYM SC_ACTION_TYPE}
 
 - SC_ACTION_TYPE = _SC_ACTION_TYPE;
 
  
- PServiceAction = ^TServiceAction;
 
 - {$EXTERNALSYM _SC_ACTION}
 
 - _SC_ACTION = record
 
 - aType : SC_ACTION_TYPE;
 
 - Delay : DWORD;
 
 - end;
 
 - {$EXTERNALSYM SC_ACTION}
 
 - SC_ACTION = _SC_ACTION;
 
 - TServiceAction = _SC_ACTION;
 
  
- PServiceFailureActionsA = ^TServiceFailureActionsA;
 
 - PServiceFailureActionsW = ^TServiceFailureActionsW;
 
 - PServiceFailureActions = PServiceFailureActionsA;
 
 - {$EXTERNALSYM _SERVICE_FAILURE_ACTIONSA}
 
 - _SERVICE_FAILURE_ACTIONSA = record
 
 - dwResetPeriod : DWORD;
 
 - lpRebootMsg : LPSTR;
 
 - lpCommand : LPSTR;
 
 - cActions : DWORD;
 
 - lpsaActions : ^SC_ACTION;
 
 - end;
 
 - {$EXTERNALSYM _SERVICE_FAILURE_ACTIONSW}
 
 - _SERVICE_FAILURE_ACTIONSW = record
 
 - dwResetPeriod : DWORD;
 
 - lpRebootMsg : LPWSTR;
 
 - lpCommand : LPWSTR;
 
 - cActions : DWORD;
 
 - lpsaActions : ^SC_ACTION;
 
 - end;
 
 - {$EXTERNALSYM _SERVICE_FAILURE_ACTIONS}
 
 - _SERVICE_FAILURE_ACTIONS = _SERVICE_FAILURE_ACTIONSA;
 
 - {$EXTERNALSYM SERVICE_FAILURE_ACTIONSA}
 
 - SERVICE_FAILURE_ACTIONSA = _SERVICE_FAILURE_ACTIONSA;
 
 - {$EXTERNALSYM SERVICE_FAILURE_ACTIONSW}
 
 - SERVICE_FAILURE_ACTIONSW = _SERVICE_FAILURE_ACTIONSW;
 
 - {$EXTERNALSYM SERVICE_FAILURE_ACTIONS}
 
 - SERVICE_FAILURE_ACTIONS = _SERVICE_FAILURE_ACTIONSA;
 
 - TServiceFailureActionsA = _SERVICE_FAILURE_ACTIONSA;
 
 - TServiceFailureActionsW = _SERVICE_FAILURE_ACTIONSW;
 
 - TServiceFailureActions = TServiceFailureActionsA;
 
  
- ///////////////////////////////////////////////////////////////////////////
 
 - // API Function Prototypes
 
 - ///////////////////////////////////////////////////////////////////////////
 
 - TQueryServiceConfig2 = function (hService : SC_HANDLE; dwInfoLevel : DWORD; lpBuffer : pointer;
 
 - cbBufSize : DWORD; var pcbBytesNeeded) : BOOL; stdcall;
 
 - TChangeServiceConfig2 = function (hService : SC_HANDLE; dwInfoLevel : DWORD; lpInfo : pointer) : BOOL; stdcall;
 
  
- var
 
 - hDLL : THandle ;
 
 - LibLoaded : boolean ;
 
  
- var
 
 - OSVersionInfo : TOSVersionInfo;
 
  
- {$EXTERNALSYM QueryServiceConfig2A}
 
 - QueryServiceConfig2A : TQueryServiceConfig2;
 
 - {$EXTERNALSYM QueryServiceConfig2W}
 
 - QueryServiceConfig2W : TQueryServiceConfig2;
 
 - {$EXTERNALSYM QueryServiceConfig2}
 
 - QueryServiceConfig2 : TQueryServiceConfig2;
 
  
- {$EXTERNALSYM ChangeServiceConfig2A}
 
 - ChangeServiceConfig2A : TChangeServiceConfig2;
 
 - {$EXTERNALSYM ChangeServiceConfig2W}
 
 - ChangeServiceConfig2W : TChangeServiceConfig2;
 
 - {$EXTERNALSYM ChangeServiceConfig2}
 
 - ChangeServiceConfig2 : TChangeServiceConfig2;
 
  
- implementation
 
  
- initialization
 
 - OSVersionInfo.dwOSVersionInfoSize := SizeOf(OSVersionInfo);
 
 - GetVersionEx(OSVersionInfo);
 
 - if (OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT) and (OSVersionInfo.dwMajorVersion >= 5) then
 
 - begin
 
 - if hDLL = 0 then
 
 - begin
 
 - hDLL:=GetModuleHandle(AdvApiDLL);
 
 - LibLoaded := False;
 
 - if hDLL = 0 then
 
 - begin
 
 - hDLL := LoadLibrary(AdvApiDLL);
 
 - LibLoaded := True;
 
 - end;
 
 - end;
 
  
- if hDLL <> 0 then
 
 - begin
 
 - @QueryServiceConfig2A := GetProcAddress(hDLL, QueryServiceConfig2A);
 
 - @QueryServiceConfig2W := GetProcAddress(hDLL, QueryServiceConfig2W);
 
 - @QueryServiceConfig2 := @QueryServiceConfig2A;
 
 - @ChangeServiceConfig2A := GetProcAddress(hDLL, ChangeServiceConfig2A);
 
 - @ChangeServiceConfig2W := GetProcAddress(hDLL, ChangeServiceConfig2W);
 
 - @ChangeServiceConfig2 := @ChangeServiceConfig2A;
 
 - end;
 
 - end
 
 - else
 
 - begin
 
 - @QueryServiceConfig2A := nil;
 
 - @QueryServiceConfig2W := nil;
 
 - @QueryServiceConfig2 := nil;
 
 - @ChangeServiceConfig2A := nil;
 
 - @ChangeServiceConfig2W := nil;
 
 - @ChangeServiceConfig2 := nil;
 
 - end;
 
  
- finalization
 
 - if (hDLL <> 0) and LibLoaded then
 
 - FreeLibrary(hDLL);
 
  
- end.
 
  
- unit winntService;
 
  
- interface
 
  
- uses
 
 - Windows,WinSvc,WinSvcEx;
 
  
- function InstallService(const strServiceName,strDisplayName,strDescription,strFilename: string):Boolean;
 
 - //eg:InstallService(服务名称,显示名称,描述信息,服务文件);
 
 - procedure UninstallService(strServiceName:string);
 
 - implementation
 
  
- function StrLCopy(Dest: PChar; const Source: PChar; MaxLen: Cardinal): PChar; assembler;
 
 - asm
 
 - PUSH EDI
 
 - PUSH ESI
 
 - PUSH EBX
 
 - MOV ESI,EAX
 
 - MOV EDI,EDX
 
 - MOV EBX,ECX
 
 - XOR AL,AL
 
 - TEST ECX,ECX
 
 - JZ @@1
 
 - REPNE SCASB
 
 - JNE @@1
 
 - INC ECX
 
 - @@1: SUB EBX,ECX
 
 - MOV EDI,ESI
 
 - MOV ESI,EDX
 
 - MOV EDX,EDI
 
 - MOV ECX,EBX
 
 - SHR ECX,2
 
 - REP MOVSD
 
 - MOV ECX,EBX
 
 - AND ECX,3
 
 - REP MOVSB
 
 - STOSB
 
 - MOV EAX,EDX
 
 - POP EBX
 
 - POP ESI
 
 - POP EDI
 
 - end;
 
  
- function StrPCopy(Dest: PChar; const Source: string): PChar;
 
 - begin
 
 - Result := StrLCopy(Dest, PChar(Source), Length(Source));
 
 - end;
 
  
- function InstallService(const strServiceName,strDisplayName,strDescription,strFilename: string):Boolean;
 
 - var
 
 - //ss : TServiceStatus;
 
 - //psTemp : PChar;
 
 - hSCM,hSCS:THandle;
 
  
- srvdesc : PServiceDescription;
 
 - desc : string;
 
 - //SrvType : DWord;
 
  
- lpServiceArgVectors:pchar;
 
 - begin
 
 - Result:=False;
 
 - //psTemp := nil;
 
 - //SrvType := SERVICE_WIN32_OWN_PROCESS and SERVICE_INTERACTIVE_PROCESS;
 
 - hSCM:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);//连接服务数据库
 
 - if hSCM=0 then Exit;//MessageBox(hHandle,Pchar(SysErrorMessage(GetLastError)),服务程序管理器,MB_ICONERROR+MB_TOPMOST);
 
  
 
- hSCS:=CreateService( //创建服务函数
 
 - hSCM, // 服务控制管理句柄
 
 - Pchar(strServiceName), // 服务名称
 
 - Pchar(strDisplayName), // 显示的服务名称
 
 - SERVICE_ALL_ACCESS, // 存取权利
 
 - SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS,// 服务类型 SERVICE_WIN32_SHARE_PROCESS
 
 - SERVICE_AUTO_START, // 启动类型
 
 - SERVICE_ERROR_IGNORE, // 错误控制类型
 
 - Pchar(strFilename), // 服务程序
 
 - nil, // 组服务名称
 
 - nil, // 组标识
 
 - nil, // 依赖的服务
 
 - nil, // 启动服务帐号
 
 - nil); // 启动服务口令
 
 - if hSCS=0 then Exit;//MessageBox(hHandle,Pchar(SysErrorMessage(GetLastError)),Pchar(Application.Title),MB_ICONERROR+MB_TOPMOST);
 
  
- if Assigned(ChangeServiceConfig2) then
 
 - begin
 
 - desc := Copy(strDescription,1,1024);
 
 - GetMem(srvdesc,SizeOf(TServiceDescription));
 
 - GetMem(srvdesc^.lpDescription,Length(desc) + 1);
 
 - try
 
 - StrPCopy(srvdesc^.lpDescription, desc);
 
 - ChangeServiceConfig2(hSCS,SERVICE_CONFIG_DESCRIPTION,srvdesc);
 
 - finally
 
 - FreeMem(srvdesc^.lpDescription);
 
 -     FreeMem(srvdesc);
 
 -     end;
 
 -   end;
 
 -   lpServiceArgVectors := nil;
 
 -   if not StartService(hSCS, 0, lpServiceArgVectors) then //启动服务
 
 -     Exit; //MessageBox(hHandle,Pchar(SysErrorMessage(GetLastError)),Pchar(Application.Title),MB_ICONERROR+MB_TOPMOST);
 
 -   CloseServiceHandle(hSCS); //关闭句柄
 
 -   Result:=True;
 
 - end;
 
  
- procedure UninstallService(strServiceName:string);
 
 - var
 
 -   SCManager: SC_HANDLE;
 
 -   Service: SC_HANDLE;
 
 -   Status: TServiceStatus;
 
 - begin
 
 -   SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
 
 -   if SCManager = 0 then Exit;
 
 -   try
 
 -     Service := OpenService(SCManager, Pchar(strServiceName), SERVICE_ALL_ACCESS);
 
 -     ControlService(Service, SERVICE_CONTROL_STOP, Status);
 
 -     DeleteService(Service);
 
 -     CloseServiceHandle(Service);
 
 -   finally
 
 -     CloseServiceHandle(SCManager);
 
 -   end;
 
 - end;
 
 - end.
 
  複製代碼 |   
 
  
 |