Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2011.02.20;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.005 c
15-1289212352
TUser
2010-11-08 13:32
2011.02.20
141183,2 тыс. человек


2-1291209781
Демерго
2010-12-01 16:23
2011.02.20
Русский шрифт в Memo


2-1291098239
George
2010-11-30 09:23
2011.02.20
ADOTable.Filter и float значения


3-1253089294
d@vinchi
2009-09-16 12:21
2011.02.20
DAO: как создать Memo поле с возможностью ввода пустых строк?


2-1290760448
ПрохожийСпб
2010-11-26 11:34
2011.02.20
поиск и считывание текста





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский