Форум: "Прочее";
Текущий архив: 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