Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.02.20;
Скачать: CL | DM;

Вниз

InnoSetup, Firebird Server   Найти похожие ветки 

 
George ©   (2010-09-21 22:00) [0]

Господа, такой вопрос по InnoSetup. Софтина моя работает с Firebird сервером, без него, само собой, подключиться к БД не сможет. Файлы сервера включены в инсталлер. Задача в том, чтобы сразу после установки он запустился. Вот кусок скрипта, отвечающий за сервер:


[Files]
Source: ..\Firebird_2_1\firebird.msg; DestDir: {pf}\Firebird\Firebird_2_1\
Source: ..\Firebird_2_1\firebird.conf; DestDir: {pf}\Firebird\Firebird_2_1\
Source: ..\Firebird_2_1\security2.fdb; DestDir: {pf}\Firebird\Firebird_2_1\
Source: ..\Firebird_2_1\bin\fbguard.exe; DestDir: {pf}\Firebird\Firebird_2_1\bin\
Source: ..\Firebird_2_1\bin\fbintl.dll; DestDir: {pf}\Firebird\Firebird_2_1\bin\
Source: ..\Firebird_2_1\bin\fbserver.exe; DestDir: {pf}\Firebird\Firebird_2_1\bin\
Source: ..\Firebird_2_1\bin\fbclient.dll; DestDir: {pf}\Firebird\Firebird_2_1\bin\
Source: ..\Firebird_2_1\bin\ib_util.dll; DestDir: {pf}\Firebird\Firebird_2_1\bin\
Source: ..\Firebird_2_1\bin\icudt30.dll; DestDir: {pf}\Firebird\Firebird_2_1\bin\
Source: ..\Firebird_2_1\bin\icuin30.dll; DestDir: {pf}\Firebird\Firebird_2_1\bin\
Source: ..\Firebird_2_1\bin\icuuc30.dll; DestDir: {pf}\Firebird\Firebird_2_1\bin\

[Run]
Filename: {pf}\Firebird\Firebird_2_1\bin\fbguard.exe; Parameters: -s DefaultInstance; Flags: nowait
Filename: {pf}\Firebird\Firebird_2_1\bin\fbserver.exe; Parameters: -s DefaultInstance; Flags: nowait

[Registry]
Root: HKLM; Subkey: Software\Firebird Project\Firebird Server\Instances; ValueType: string; ValueName: DefaultInstance; ValueData: {pf}\Firebird\Firebird_2_1

Root: HKLM; SubKey: SYSTEM\CurrentControlSet\Services\FirebirdGuardianDefaultInstance; ValueType: dword; ValueName: Type; ValueData: $00000010
Root: HKLM; SubKey: SYSTEM\CurrentControlSet\Services\FirebirdGuardianDefaultInstance; ValueType: dword; ValueName: Start; ValueData: $00000002
Root: HKLM; SubKey: SYSTEM\CurrentControlSet\Services\FirebirdGuardianDefaultInstance; ValueType: dword; ValueName: ErrorControl; ValueData: $00000001
Root: HKLM; SubKey: SYSTEM\CurrentControlSet\Services\FirebirdGuardianDefaultInstance; ValueType: string; ValueName: ImagePath; ValueData: {pf}\Firebird\Firebird_2_1\bin\fbguard.exe -s DefaultInstance
Root: HKLM; SubKey: SYSTEM\CurrentControlSet\Services\FirebirdGuardianDefaultInstance; ValueType: string; ValueName: DisplayName; ValueData: Firebird Guardian - DefaultInstance
Root: HKLM; SubKey: SYSTEM\CurrentControlSet\Services\FirebirdGuardianDefaultInstance; ValueType: string; ValueName: ObjectName; ValueData: LocalSystem
Root: HKLM; SubKey: SYSTEM\CurrentControlSet\Services\FirebirdGuardianDefaultInstance; ValueType: string; ValueName: Description; ValueData: Firebird Server Guardian - www.firebirdsql.org

Root: HKLM; SubKey: SYSTEM\CurrentControlSet\Services\FirebirdServerDefaultInstance; ValueType: dword; ValueName: Type; ValueData: $00000010
Root: HKLM; SubKey: SYSTEM\CurrentControlSet\Services\FirebirdServerDefaultInstance; ValueType: dword; ValueName: Start; ValueData: $00000003
Root: HKLM; SubKey: SYSTEM\CurrentControlSet\Services\FirebirdServerDefaultInstance; ValueType: dword; ValueName: ErrorControl; ValueData: $00000001
Root: HKLM; SubKey: SYSTEM\CurrentControlSet\Services\FirebirdServerDefaultInstance; ValueType: string; ValueName: ImagePath; ValueData: {pf}\Firebird\Firebird_2_1\bin\fbserver.exe -s DefaultInstance
Root: HKLM; SubKey: SYSTEM\CurrentControlSet\Services\FirebirdServerDefaultInstance; ValueType: string; ValueName: DisplayName; ValueData: Firebird Server - DefaultInstance
Root: HKLM; SubKey: SYSTEM\CurrentControlSet\Services\FirebirdServerDefaultInstance; ValueType: string; ValueName: ObjectName; ValueData: LocalSystem
Root: HKLM; SubKey: SYSTEM\CurrentControlSet\Services\FirebirdServerDefaultInstance; ValueType: string; ValueName: Description; ValueData: Firebird Database Server - www.firebirdsql.org

Но видимо чего-то не хватает. Потому как сервер сразу не регистрируется в службах. По идее надо с ключом /install запускать, но ведь он регистрируется автоматически после ребута. Хочется сразу после окончания установки зарегистрировать сервер как службу и запустить. Чтобы юзер поставил галочку Run application, нажал на финиш и программа запустилась. Как это сделать правильно?


 
Дмитрий Тимохов   (2010-09-21 22:12) [1]

зачем ребут?

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

я думаю и FB это умеет. разве нет?

у меня несколько самописных серверов-служб регистрируются и запускаются прямо из Inno. но я делаю это сам в событиях в секции [Code] (или [Script] подзабыл уже). но главное, что я это кодом сам делаю.


 
George ©   (2010-09-21 22:17) [2]


> Дмитрий Тимохов   (21.09.10 22:12) [1]

Ну вот то то и оно. По идее если выполнить в командной строке:
C:\Program Files\Firebird\Firebird_2_1\bin\fbguard.exe /install
C:\Program Files\Firebird\Firebird_2_1\bin\fbserver.exe /install

То все должно зарегистрироваться. Правда не запустится.
Пример бы кода Вашего.


 
Loginov Dmitry ©   (2010-09-21 22:23) [3]

Можно батничком, например:
@ECHO OFF
CD Путь к Firebird\Bin
instsvc i -n ИмяРегистрируемойСлужбы
instsvc start -n ИмяРегистрируемойСлужбы
EXIT


 
Inovet ©   (2010-09-21 22:23) [4]

> [2] George ©   (21.09.10 22:17)
> Правда не запустится.

если из команлной строки надо, то
net start


 
George ©   (2010-09-21 22:27) [5]


> Inovet ©   (21.09.10 22:23) [4]

надо из InnoSetup.
Попробую сейчас батник создать вышеприведенный и его запустить. :)


 
Дмитрий Тимохов   (2010-09-21 22:33) [6]



procedure CurStepChanged(CurStep: TSetupStep);
var
 kResult, kErrorCode: Integer;
 kMessage: String;
 kOk: Boolean;
begin
 // Добавим в реестр запись о продукте
 if CurStep = ssPostInstall then
 begin
   RegWriteStringValue(HKEY_LOCAL_MACHINE, "Software\VKKB-BusinessCourse\" + GetAppId(""), "DataDirectory", ExpandConstant("{app}\Data"));
   RegWriteStringValue(HKEY_LOCAL_MACHINE, "Software\VKKB-BusinessCourse\" + GetAppId(""), "LogDirectory", ExpandConstant("{app}\Log"));

   // Установка службы
   kOk := Exec(ExpandConstant("{app}\BcService20.exe"), "/install /silent", "", 0, ewWaitUntilTerminated, kResult);
   kOk := kOk and (kResult = 0);
   if not kOk then
     MsgBox(Format(
       "Не удалось установить службу ""+cServiceDisplayName+""."#13+
       "Ошибка: %s", [kMessage]), mbError, MB_OK);

   // Запуск службы
   if not ExecServiceManager(cServiceName+" /start", kMessage, kErrorCode) then
     MsgBox(Format(
       "Не удалось запустить службу ""+cServiceDisplayName+""."#13+
       "Ошибка: %s"#13#13+
       "Устраните проблему и запустите службу с помощью консоли управления службами.", [kMessage]), mbError, MB_OK);
 end;
end;



здесь ExecServiceManager это


// Выполнить менеджер служб с заданными параметрами командной строки.
// aCmdLine - параметры ком. строки
// aMessage - сообщение, возвращаемое в случае ошибки
// aCode - код ошибки
// Возвращает true, если менеджер служб отработал нормально, иначе false
function ExecServiceManager(const aCmdLine: String; var aMessage: String; var aCode: Integer): Boolean;
var
 kErrorCode: Integer;
begin
 Result := false;
 aMessage := "";
 aCode := 0;
 if not Exec(ExpandConstant("{app}\ServiceManager.exe"), aCmdLine, "", 0, ewWaitUntilTerminated, aCode) then
 begin
   aMessage := Format("ошибка Windows: код ошибки %d, сообщение "%s"", [aCode, SysErrorMessage(aCode)]);
 end
 else
 begin
   // Нормальное завершение
   if aCode = 0 then
   begin
     Result := true;
   end
   else
   begin
     // Ошибка Windows
     if (aCode and $10000) = 0 then
     begin
       aMessage := Format("ошибка Windows: код ошибки %d, сообщение "%s"", [aCode, SysErrorMessage(aCode)]);
     end
     else
     begin
       // Наши ошибки
       kErrorCode := aCode and (not $10000);
       case kErrorCode of
         1: aMessage := "недостатчно прав для остановки службы.";
         2: aMessage := "служба не найдена";
         3: aMessage := "неверное имя службы";
         100: aMessage := Format("ошибка %d", [kErrorCode]);
       else
         // Ошибки, необработанные менеджером служб (на всякий случай проверяем, такие ошибки маловероятны)
         aMessage := Format("ошибка %d", [kErrorCode]);
       end;
     end;
   end;
 end;
end;


 
Дмитрий Тимохов   (2010-09-21 22:35) [7]

ServiceManager.exe это

program ServiceManager;

uses
  SysUtils,
  krnServiceUtils;

var
  kServiceName: String;
begin
  // Утилита управления сервисом.
  // Имя сервиса задается первым параметром.
  // Второй параметр один из трех:
  //    /stop - останавливает сервис.
  //    /start - запускает сервис.
  //    /exists - проверяет существование сервиса. Возвращает в ExitCode 0,
  //              если существует.
  //
  // Возможные значения ExitCode:
  // 65537 = $10001 - нет прав на управление сервисом (для всех трех ключей).
  // 65538 = $10002 - указанный сервис не найден (для всех трех ключей).
  // 65539 = $10003 - неверное имя сервиса (для всех трех ключей).
  // 65540 = $10004 - сервис уже запущен (только для ключа /start).
  // 65541 = $10005 - сервис уже остановлен (только для ключа /stop).
  // < 15999 - прочая ошибка windows (для всех трех ключей).
  // 65792 = $10100 - прочее исключение (для всех трех ключей).
  // 66048 = $10200 - неверные параметры: задан ключ отличный от /stop, /start и /exists.

  kServiceName := ParamStr(1);
  try
     TkrnServiceUtils.CheckAccess(kServiceName);
     if FindCmdLineSwitch("stop") then
        TkrnServiceUtils.Stop(kServiceName)
     else
        if FindCmdLineSwitch("start") then
           TkrnServiceUtils.Start(kServiceName)
        else
           if FindCmdLineSwitch("exists") then
              TkrnServiceUtils.CheckAccess(kServiceName)
           else
           begin
              ExitCode := $10000 or 200;
              Exit;
           end;
     ExitCode := 0;
  except
     // Чтобы не путать наши ошибки с системными, OR-им с $10000
     // ($10000 = 65536, а максимальнй код ошибки Windows 15999)

     on E: TkrnServiceUtils.EAccessDenied do
        ExitCode := $10000 or 1;

     on E: TkrnServiceUtils.EServiceIsNotFound do
        ExitCode := $10000 or 2;

     on E: TkrnServiceUtils.EWrongServiceName do
        ExitCode := $10000 or 3;

     on E: TkrnServiceUtils.EServiceIsAlreadyRunning do
        ExitCode := $10000 or 4;

     on E: TkrnServiceUtils.EServiceIsAlreadyStopped do
        ExitCode := $10000 or 5;

     on E: EOsError do
        ExitCode := E.ErrorCode;

     on E: Exception do
        ExitCode := $10000 or 100;
  end;
end.


а модуль krnServiceUtils это

// Пакет Kern.
//
// Утилитки работы с сервисами windows

unit krnServiceUtils;

interface

uses
  Windows, WinSvc, SysUtils, Registry,
  krnCommon;

type

  {$region "TkrnServiceUtils"}

     TkrnServiceUtils = class sealed(TNoInstance)

        {$region "<<public>>"}

           // Исключения
           public type EException               = class abstract(Exception);
              public type EAccessDenied              = class sealed(EException);
              public type EWrongServiceName          = class sealed(EException);
              public type EServiceIsNotFound         = class sealed(EException);
              public type EServiceIsAlreadyRunning   = class sealed(EException);
              public type EServiceIsAlreadyStopped   = class sealed(EException);
              public type EWrongServiceState         = class sealed(EException);
              public type ECannotWaitForServiceState = class sealed(EException);

           // Устанавливает для сервиса aServiceName описание aServiceDescription.
           // В случае ошибки возбуждается исключение с помощью RaiseLastOSError.
           public class procedure SetServiceDescription(
              const aServiceName, aServiceDescription: String); static;

           // Записывает в реестр необходимые для того, чтобы сообщения
           // сервиса aServiceName корректно отображались в EventViewer.
           // Метод вызывается при инсталяции сервиса.
           // См. в теле метода.
           public class procedure InstallKeysToEventLogRegistryEntry(
              const aServiceName: String); static;
           // Обратное действие к пред. методу - удаляет данные из реестра.
           // Вызывается при деинсталяции сервиса.
           public class procedure UninstallKeysFromEventLogRegistryEntry(
              const aServiceName: String); static;

           // Проверить возможность доступа к сервису,
           // т.е. есть ли у вызывающей стороны права на управление сервисом:
           // запуск, остановки или получение статуса.
           // В случае отсутствия прав возбуждается исключение EAccessDenied.
           public class procedure CheckAccess(const aServiceName: String); static;

           // Остановка сервиса
           public class procedure Stop(const aServiceName: String); static;

           // Запуск сервиса
           public class procedure Start(const aServiceName: String); static;

           // Получение состояния сервиса
           public type TServiceState = (ssStartPending, ssRunning,
              ssStopPending, ssStopped);
           public class function GetState(const aServiceName: String): TServiceState; static;

        {$endregion} // <<public>>

        {$region "<<private>>"}

           // Ожидает у сервиса требуемого статуса.
           // Детали см. в теле метода.
           private class procedure fWaitForState(const aServiceHandle: THandle;
              const aState: DWORD); static;

           // Обертка над OpenSCManager
           private class function fOpenSCManager(): THandle; static;

           // Обертка над CloseServiceHandle
           private class procedure fCloseSCManager(
              const aServiceControlManagerHandle: THandle); static;

           // Обертка над OpenService
           private class function fOpenService(const aServiceName: String;
              const aServiceControlManagerHandle: THandle): THandle; static;

           // Обертка над CloseServiceHandle
           private class procedure fCloseService(const aServiceHandle: THandle); static;
       
        {$endregion} // <<private>>

     end;

  {$endregion} // TkrnServiceUtils


 
Дмитрий Тимохов   (2010-09-21 22:36) [8]

implementation

{$region "TkrnServiceUtils"}

const
  SERVICE_CONFIG_DESCRIPTION = 1;
type
  SERVICE_DESCRIPTION = packed record
     lpDescription: LPSTR;
  end;
  function ChangeServiceConfig2(hService: SC_HANDLE; dwInfoLevel: DWORD;
     lpInfo: Pointer): BOOL; stdcall; external advapi32 name "ChangeServiceConfig2A";

class procedure TkrnServiceUtils.SetServiceDescription(
  const aServiceName, aServiceDescription: String);
var
  kSCMHandle: SC_HANDLE;
  kServiceHandle: SC_HANDLE;
  kServiceDescription: SERVICE_DESCRIPTION;
begin
  // Код взят отсюда http://msdn2.microsoft.com/en-us/library/ms682006.aspx
  // из функции DoUpdateSvcDesc.

  // Get a handle to the SCM database.
  kSCMHandle := OpenSCManager(
     nil,                    // local computer
     nil,                    // ServicesActive database
     SC_MANAGER_ALL_ACCESS); // full access rights
  if kSCMHandle = 0 then
     RaiseLastOSError();

  try

     // Get a handle to the service.
     kServiceHandle := OpenService(
        kSCMHandle,             // SCM database
        PAnsiChar(aServiceName),// name of service
        SERVICE_CHANGE_CONFIG); // need change config access
     if kServiceHandle = 0 then
        RaiseLastOSError();

     try

        // Change the service description.
        kServiceDescription.lpDescription := LPSTR(aServiceDescription);
        if not ChangeServiceConfig2(
           kServiceHandle,             // handle to service
           SERVICE_CONFIG_DESCRIPTION, // change: description
           @kServiceDescription)       // new description
        then
           RaiseLastOSError();

     finally
        if not CloseServiceHandle(kServiceHandle) then
           RaiseLastOSError();
     end;
  finally
     if not CloseServiceHandle(kSCMHandle) then
        RaiseLastOSError();
  end;
end;

const cEventLogRegistryEntry = "SYSTEM\CurrentControlSet\Services\EventLog\Application";

class procedure TkrnServiceUtils.InstallKeysToEventLogRegistryEntry(
  const aServiceName: String);
var
  kRegistry: TRegistry;
begin
  // Суть проблемы описана тут http://www.codenet.ru/progr/delphi/stat/Event-Log.php
  //
  // Напомню проблему - в журнале событий наши сообщения выводятся
  // некрасиво: типа "The description for Event ID ( 0 ) in
  // Source ( MyApplication ) cannot be found. The local computer
  // may not .... and bla-bla-bla".
  //
  // Все происходит потому, что EventLog не знает откуда брать шаблоны для сообщений.
  //
  // См. подробнее EventLogDoc.txt, расположенный в той же папке, что и текущий модуль.
  // Там описано, как надо работать с журналом событий через Delphi.
  //
  // Кратко суть решения проблемы - дописать в реестр необходимые данные.

  kRegistry := TRegistry.Create();
  try
     kRegistry.RootKey := HKEY_LOCAL_MACHINE;
     kRegistry.OpenKey(cEventLogRegistryEntry + "\" + aServiceName, True);

     // Файл с названиями категорий сообщений. Это сам исполняемый файл приложения.
     // NB В ключах CategoryMessageFile и EventMessageFile
     //    должны храниться полные имена файлов, где есть требуемые ресурсы.
     kRegistry.WriteString("CategoryMessageFile", ParamStr(0));

     // Файл с сообщениями. Это сам исполняемый файл приложения.
     kRegistry.WriteString("EventMessageFile", ParamStr(0));

     // Максимальное количество категорий. У нас нет категроий, ставим 0
     kRegistry.WriteInteger("CategoryCount", 0);

     // Разрешаем все типы
     kRegistry.WriteInteger("TypesSupported",
        EVENTLOG_SUCCESS or
        EVENTLOG_ERROR_TYPE or
        EVENTLOG_WARNING_TYPE or
        EVENTLOG_INFORMATION_TYPE);
     kRegistry.CloseKey();
  finally
     kRegistry.Free();
  end;
end;



 
Дмитрий Тимохов   (2010-09-21 22:37) [9]

class procedure TkrnServiceUtils.UninstallKeysFromEventLogRegistryEntry(
  const aServiceName: String);
var
  kRegistry: TRegistry;
begin
  // См. коммент в начале метода fInstallKeysToEventLogRegistryEntry.
  kRegistry := TRegistry.Create();
  try
     kRegistry.RootKey := HKEY_LOCAL_MACHINE;
     kRegistry.OpenKey(cEventLogRegistryEntry, False);
     kRegistry.DeleteKey(aServiceName);
  finally
     kRegistry.Free();
  end;
end;

class procedure TkrnServiceUtils.CheckAccess(const aServiceName: String);
var
  kServiceControlManagerHandle, kServiceHandle: THandle;
begin
  kServiceControlManagerHandle := fOpenSCManager();
  try
     kServiceHandle := fOpenService(aServiceName, kServiceControlManagerHandle);
     fCloseService(kServiceHandle);
  finally
     fCloseSCManager(kServiceControlManagerHandle);
  end;
end;

class procedure TkrnServiceUtils.Stop(const aServiceName: String);
var
  kServiceControlManagerHandle, kServiceHandle: THandle;
  kStatus: TServiceStatus;
begin
  kServiceControlManagerHandle := fOpenScManager();
  try
     kServiceHandle := fOpenService(aServiceName, kServiceControlManagerHandle);
     try
        // Остановка сервиса работает по алгоритму:
        // 1. Если сервис уже остановлен (статус STOPPED), выбросить ошибку
        // 2. Если сервис останавливается (статус STOP_PENDING),
        //    то подождать остановки
        // 3. Иначе послать код STOP и ждать остановки

        // Получить статус
        if not QueryServiceStatus(kServiceHandle, kStatus) then
           RaiseLastOsError();

        // Если уже остановлен, возбудим ошибку
        if kStatus.dwCurrentState = SERVICE_STOPPED then
           raise EServiceIsAlreadyStopped.Create("Сервер уже остановлен.");

        // Ждем остановки, если идет процесс остановки
        // Если останавливается, подождем остановки
        if kStatus.dwCurrentState = SERVICE_STOP_PENDING then
           fWaitForState(kServiceHandle, SERVICE_STOPPED)
        else
        begin
           if not ControlService(kServiceHandle, SERVICE_CONTROL_STOP, kStatus) then
              RaiseLastOsError()
           else
              fWaitForState(kServiceHandle, SERVICE_STOPPED);
        end;

     finally
        fCloseService(kServiceHandle);
     end;
  finally
     fCloseScManager(kServiceControlManagerHandle);
  end;
end;

class procedure TkrnServiceUtils.Start(const aServiceName: String);
var
  kServiceControlManagerHandle, kServiceHandle: THandle;
  kStatus: TServiceStatus;
  kArgs: PChar;
begin
  kServiceControlManagerHandle := fOpenScManager();
  try
     kServiceHandle := fOpenService(aServiceName, kServiceControlManagerHandle);
     try
        // Запуск сервиса работает по алгоритму:
        // 1. Если сервис уже работает (статус RUNNING), выбросить ошибку
        // 2. Если сервис запускается (статус START_PENDING), то подождать пока не
        // запустится
        // 3. Иначе послать код Start и ждать запуска

        // Получить статус
        if not QueryServiceStatus(kServiceHandle, kStatus) then
           RaiseLastOsError();

        // Если уже работает, возбудим ошибку
        if kStatus.dwCurrentState = SERVICE_RUNNING then
           raise EServiceIsAlreadyRunning.Create("Сервер уже работает.");

        // Если сервис уже запускается, ждем пока не запустится
        if kStatus.dwCurrentState = SERVICE_START_PENDING then
           fWaitForState(kServiceHandle, SERVICE_RUNNING)
        else
        begin
           kArgs := nil;
           if not StartService(kServiceHandle, 0, kArgs) then
              RaiseLastOsError()
           else
              fWaitForState(kServiceHandle, SERVICE_RUNNING);
        end;

     finally
        fCloseService(kServiceHandle);
     end;
  finally
     fCloseScManager(kServiceControlManagerHandle);
  end;
end;

class function TkrnServiceUtils.GetState(const aServiceName: String): TServiceState;
var
  kServiceControlManagerHandle, kServiceHandle: THandle;
  kStatus: TServiceStatus;
begin
  kServiceControlManagerHandle := fOpenScManager();
  try
     kServiceHandle := fOpenService(aServiceName, kServiceControlManagerHandle);
     try
        // Получить статус
        if not QueryServiceStatus(kServiceHandle, kStatus) then
           RaiseLastOsError();
        case kStatus.dwCurrentState of
           SERVICE_START_PENDING: Result := ssStartPending;
           SERVICE_RUNNING: Result := ssRunning;
           SERVICE_STOP_PENDING: Result := ssStopPending;
           SERVICE_STOPPED: Result := ssStopped;
           else
           begin
              Result := ssStopped; // глушим ворнинг
              raise EWrongServiceState.CreateFmt(
                 "Неверный статус сервиса: %d.",
                 [kStatus.dwCurrentState]);
           end;
        end;
     finally
        fCloseService(kServiceHandle);
     end;
  finally
     fCloseScManager(kServiceControlManagerHandle);
  end;
end;



 
Дмитрий Тимохов   (2010-09-21 22:37) [10]

все, разбирайся. должно работать.
может модули не все, но идея понятна


 
Дмитрий Тимохов 2   (2010-09-21 22:47) [11]

в общем, тут )
http://zalil.ru/29709518


 
George ©   (2010-09-21 23:01) [12]


> Loginov Dmitry ©   (21.09.10 22:23) [3]

на instsvc ругаецо. Забыл упомянуть что на Win 7 дело происходит.


 
George ©   (2010-09-21 23:03) [13]

2 Дмитрий Тимохов:
Премного благодарен за старания. Буду пробовать. :)


 
Медвежонок Пятачок ©   (2010-09-21 23:11) [14]

Фрагмент рабочего инноскрипта:

[Run]
;Инсталяция сервера
FileName: {pf}\Firebird 2.0\bin\install_super.bat; Flags: runhidden skipifdoesntexist

батник штатный файербердовский
instreg install -z
instsvc install -auto -superserver -guardian -z
instsvc start

сервис инсталлится и сразу запускается


 
Дмитрий Тимохов 2   (2010-09-21 23:29) [15]

батник вроде должен промелькнуть черным окошком...
разве нет?


 
Loginov Dmitry ©   (2010-09-22 00:26) [16]


> на instsvc ругаецо.


Ну так надо путь правильный установить.


> Забыл упомянуть что на Win 7 дело происходит.


А это без разницы.


 
George ©   (2010-09-22 00:32) [17]

В общем почти разобрался. Понял, что instreg и instsvc это екзешники, которые идут в комплекте с файрбердом, включил их в инсталлер. батник взял у медвежонка пятачка. Батник из под админа вручную работает. Когда инсталлер - не работает. Почему - неясно. Будто прав не хватает (из под обычного пользователя он действительно не будет работать). Есть идеи? )


 
Дмитрий Тимохов 2   (2010-09-22 00:34) [18]

свой инсталлер должен тербовать, чтобы запскающий был админом - там флажок есть, см. справку.

все равно обычный юзен не сможет инсталлировать службу.


 
George ©   (2010-09-22 00:38) [19]


> Дмитрий Тимохов 2   (22.09.10 00:34) [18]

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


 
Дмитрий Тимохов 2   (2010-09-22 00:42) [20]

все не айс с батником ) он же будет вылезать черным окошечком )


 
George ©   (2010-09-22 00:48) [21]


> Дмитрий Тимохов 2   (22.09.10 00:42) [20]

Не, не вылезает. Флаг Run Hidden же стоит )


 
Дмитрий Тимохов 2   (2010-09-22 00:52) [22]

Да... ну тогда ладно))

Я почему-то в свое время запуск службы сам в итоге написал.
Давно было. Наверное еще доки не читал и про run hidden не видел. ))

Рад, что ты нашел более быстрое для себя решение. А то я тебе кода что-то накидал - неделю разбираться.

Удачи.


 
George ©   (2010-09-22 01:05) [23]


> Дмитрий Тимохов 2   (22.09.10 00:52) [22]

Спасибо. Пока не очень че то выходит. Насколько я понял служба регится, но не стартует. Но я спать, изыскания завтра продолжу.


 
George ©   (2010-09-22 23:58) [24]

Грех не озвучить результат. За основу был взят код Медвежонка Пятачка, за что отдельное спасибо. Затем нагуглилось, что ж такое за instreg и instsvc:
www.destructor.de/firebird/instreg.htm
www.destructor.de/firebird/instsvc.htm

Затем я решил, что нафиг мне батник, я все это запущу прям в секции Run:

[Run]
FileName: {pf}\Firebird\Firebird_2_1\bin\instreg.exe; Parameters: install; Flags: runhidden nowait; WorkingDir: {pf}\Firebird\Firebird_2_1\bin\
FileName: {pf}\Firebird\Firebird_2_1\bin\instsvc.exe; Parameters: install -g; Flags: runhidden nowait; WorkingDir: {pf}\Firebird\Firebird_2_1\bin\
FileName: {pf}\Firebird\Firebird_2_1\bin\instsvc.exe; Parameters: start; Flags: runhidden nowait; WorkingDir: {pf}\Firebird\Firebird_2_1\bin\


 
George ©   (2010-09-23 00:00) [25]

Ну и работает вроде, ага


 
Сергей   (2010-11-09 01:54) [26]

Удалено модератором
Примечание: У нас не запрещается создавать свою тему.


 
Сергей   (2010-11-09 01:55) [27]

Удалено модератором


 
Сергей   (2010-11-09 01:55) [28]

Удалено модератором


 
Сергей   (2010-11-09 01:56) [29]

Удалено модератором


 
boriskb ©   (2010-11-09 08:53) [30]

Вот это я понимаю.
Столько уважения!


 
ZeroDivide ©   (2010-11-09 11:01) [31]

Устанавливайте FB из innosetup прямо из его инсталятора. Т.е. в ваш скрипт нужно просто включить инсталлятор и запустить его по окончании установки с ключем /verysilent



Страницы: 1 вся ветка

Текущий архив: 2011.02.20;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.008 c
15-1289337316
Kerk
2010-11-10 00:15
2011.02.20
Катастрофа


15-1289380219
12
2010-11-10 12:10
2011.02.20
Комфортно работать с большими treelistview


2-1291178663
Василич
2010-12-01 07:44
2011.02.20
Обработчик ошибок TWordApplication


15-1288631685
Tema
2010-11-01 20:14
2011.02.20
Как зарегистрироваться на Embarcadero?


2-1290694178
ghostdelvonte@mail.ru
2010-11-25 17:09
2011.02.20
Принудительная раскладка языка