В дополнение к принятому ответу я бы хотел, чтобы людям было проще пользоваться сервисной библиотекой Луиджи Сандона (большое спасибо!). После загрузки скрипта вам необходимо добавить секцию [Код] , аналогичную следующей в вашем скрипте установки:
[Code]
// source: https://stackoverflow.com/a/5416744
#include "services_unicode.iss"
const
SERVICE_NAME = 'MyService';
SERVICE_DISPLAY_NAME = 'MyService';
SERVICE_EXE = 'MyService.exe';
procedure CurStepChanged(CurStep: TSetupStep);
begin
Log('CurStepChanged(' + IntToStr(Ord(CurStep)) + ') called');
if CurStep = ssInstall then begin
if ServiceExists(SERVICE_NAME) then begin
if SimpleQueryService(SERVICE_NAME) = SERVICE_RUNNING then begin
SimpleStopService(SERVICE_NAME, True, False);
end;
SimpleDeleteService(SERVICE_NAME);
end;
end
else if CurStep = ssPostInstall then begin
SimpleCreateService(SERVICE_NAME, SERVICE_DISPLAY_NAME, ExpandConstant('{app}\' + SERVICE_EXE), SERVICE_AUTO_START, '', '', False, False);
SimpleStartService(SERVICE_NAME, True, False);
end;
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
Log('CurUninstallStepChanged(' + IntToStr(Ord(CurUninstallStep)) + ') called');
if CurUninstallStep = usUninstall then begin
if ServiceExists(SERVICE_NAME) then begin
if SimpleQueryService(SERVICE_NAME) = SERVICE_RUNNING then begin
SimpleStopService(SERVICE_NAME, True, False);
end;
SimpleDeleteService(SERVICE_NAME);
end;
end;
end;
Это не пуленепробиваемый, но в большинстве случаев подходит просто.
К сожалению, я не смог выяснить, есть ли способ использовать синтаксис {# VarName}
emit в разделе [Code], поэтому я объявил имя службы и т. Д. В качестве констант , а также #define
находится вверху файла. Ответы здесь полезны , если постоянная, которую вы хотите, является одной из настроек секции [Setup], но поскольку вы не можете произвольно добавлять вещи в эту секцию, это не работает все вещи, для которых вы можете определить константы.
Если вы хотите задать описание для вашей службы, то библиотека служб не поддерживает это, но это достаточно просто сделать, используя раздел [Registry] , например:
[Registry]
; set the service description
Root: HKLM; Subkey: "System\CurrentControlSet\Services\{#ServiceName}"; ValueType: string; ValueName: "Description"; ValueData: "{#ServiceDescription}"; Flags: deletevalue uninsdeletekey
Наконец, я могу подтвердить, что это работает и в Windows 10.