Ich würde empfehlen, den dokumentierten Weg zu nehmen, und das ist die Verwendung von
ChangeServiceConfig2
Hier ein Auszug aus einer Klasse, die ich mal geschrieben habe:
Delphi-Quellcode:
procedure TServiceInstaller.SetDescription(const Value: String);
var
sd: TServiceDescription;
begin
if FServiceOpened then
begin
sd.lpDescription := PChar(Value);
ChangeServiceConfig2(FhService, SERVICE_CONFIG_DESCRIPTION, @sd);
FDescription := Value;
end;
end;
FhService ist hier das
Handle des geöffneten Dienstes.
Eventuell musst du dir noch die Funktionsdeklaration und den Typ TServiceDescription importieren:
Delphi-Quellcode:
unit Winscv_fragment;
interface
uses Winsvc, Windows;
function ChangeServiceConfig2A(hService: SC_HANDLE; dwInfoLevel: DWord;
lpInfo: Pointer): BOOL;
stdcall;
function ChangeServiceConfig2W(hService: SC_HANDLE; dwInfoLevel: DWord;
lpInfo: Pointer): BOOL;
stdcall;
function ChangeServiceConfig2(hService: SC_HANDLE; dwInfoLevel: DWord;
lpInfo: Pointer): BOOL;
stdcall;
type
_SERVICE_DESCRIPTIONA =
packed record
lpDescription: PChar;
end;
TServiceDescriptionA = _SERVICE_DESCRIPTIONA;
PServiceDescriptionA = ^TServiceDescriptionA;
_SERVICE_DESCRIPTIONW =
packed record
lpDescription: PWChar;
end;
TServiceDescriptionW = _SERVICE_DESCRIPTIONW;
PServiceDescriptionW = ^TServiceDescriptionW;
//we use the ANSI version
TServiceDescription = TServiceDescriptionA;
const
SERVICE_CONFIG_DESCRIPTION = 1;
SERVICE_CONFIG_FAILURE_ACTIONS = 2;
implementation
function ChangeServiceConfig2A;
external advapi32
name '
ChangeServiceConfig2A';
function ChangeServiceConfig2W;
external advapi32
name '
ChangeServiceConfig2W';
function ChangeServiceConfig2;
external advapi32
name '
ChangeServiceConfig2A';
end.