Установите службу в Windows (Vista / XP / 7) с помощью Inno Setup - PullRequest
4 голосов
/ 24 марта 2011

Мне нужно установить и запустить службу при установке приложения (файл installer.exe создается с помощью Inno Setup)

Я использовал приведенные ниже коды

[Run]
Filename:"{sys}\myservice.exe "; Parameters: "-install"

Я не уверен, что этоявляется правильным

(я добавляю коды для перезагрузки напоминания, но мне интересно, возможно ли запустить службу сразу после установки без перезагрузки компьютера.)

[Setup]
AlwaysRestart=yes

Приветствую любой комментарий.

Ответы [ 3 ]

12 голосов
/ 24 марта 2011
  1. Используйте sc.exe, это просто, единственный недостаток в том, что вам, возможно, придется перехватывать и анализировать вывод, чтобы узнать, что пошло не так, если он это сделал.
  2. Использовать мою настройку Inno сервисная библиотека .Это оболочка Pascal Script для SCM API, позволяющая полностью контролировать сервисы.Немного сложнее в использовании, но он позволяет полностью проверять и обрабатывать ошибки.Существуют некоторые функции более высокого уровня, предназначенные для отображения ошибок в стандартных подавляемых диалоговых окнах Inno Setup.

PS: не устанавливайте службу в какой-либо системной папке Windows.Их следует рассматривать как личные папки Windows.Если у вас нет очень и очень веских причин для написания там (т.е. драйверов), вы никогда не должны устанавливать программное обеспечение там.Установите его в папки вашего приложения.

2 голосов
/ 26 мая 2017

В дополнение к принятому ответу я бы хотел, чтобы людям было проще пользоваться сервисной библиотекой Луиджи Сандона (большое спасибо!). После загрузки скрипта вам необходимо добавить секцию [Код] , аналогичную следующей в вашем скрипте установки:

[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.

1 голос
/ 24 марта 2011

использование Сервисные функции для Inno Setup от Silvio Iaccarino

...