_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