- 註冊時間
- 2006-3-13
- 最後登錄
- 2025-1-10
- 在線時間
- 673 小時
- 閱讀權限
- 200
- 積分
- 417
- 帖子
- 1107
- 精華
- 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.
複製代碼 |
|