powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Кто-то пробовал связку InnoSetup + IBEScript?
4 сообщений из 4, страница 1 из 1
Кто-то пробовал связку InnoSetup + IBEScript?
    #39065575
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникла задумка соорудить инсталлятор для одного приложения. В процессе оказалось, что InnoSetup умеет выполнять паскалевский код во время инсталляции. Захотелось попробовать прямо из инсталлятора подключиться к СУБД и записать туда кое-какие данные. InnoSetup позволяет использовать функции из внешних библиотек , но подружить его с ibescript никак не могу.

Вот моя попытка подключения из InnoSetup по мотивам кода отсюда :

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
type
  TConnectErrorCallbackFunc = function (AErrorMessage : PChar) : integer; 
  TScriptErrorCallbackFunc = function (AStmtText, AErrMessage : PChar) : integer; 
  TScriptBeforeExecStatementFunc = function (AStmtText, AText : PChar) : integer; 
  TScriptAfterExecStatementFunc = function (AStmtText : PChar; Success : integer) : integer; 
  TScriptIBEBlockProgressFunc = function (AProgressMessage : PChar) : integer; 
  TExecuteScriptProc = procedure (AScriptFile : PAnsiChar;
                                  AErrorCallbackFunc : TScriptErrorCallbackFunc;
                                  ABeforeCallbackFunc : TScriptBeforeExecStatementFunc;
                                  AAfterCallbackFunc : TScriptAfterExecStatementFunc); 
  TConnectDBProc = function (AConnectParams : PAnsiChar;
                             AConnectErrorCallbacFunc : TConnectErrorCallbackFunc) : integer; 
var
  DBPage: TInputQueryWizardPage;
  DBServer, DBName: String;
function HandleError(AStmtText, AErrMessage : PAnsiChar) : integer; 
begin
  Result := 0;
end;

function BeforeExec(AStmtText, AText : PAnsiChar) : integer; 
begin
  Result := 0;
end;

function AfterExec(AStmtText : PAnsiChar; Success : integer) : integer; 
begin
  Result := 0;
end;

function BlockProgress(AProgress : PAnsiChar) : integer; 
begin
  Result := 0;
end;

function CEH(AErrorMessage : PAnsiChar) : integer;  
begin
  MsgBox('DB connect error ' + AErrorMessage, mbInformation, MB_OK);
  Result := 0;
end;
function ConnectDB(AConnectParams : PAnsiChar; 
          AConnectErrorCallbacFunc : TConnectErrorCallbackFunc) : integer;
external 'Connect@files:IBEScript.dll stdcall';

procedure TExecuteScriptProc2(AScriptFile : PChar;
                              AErrorCallbackFunc : TScriptErrorCallbackFunc;
                              ABeforeCallbackFunc : TScriptBeforeExecStatementFunc;
                              AAfterCallbackFunc : TScriptAfterExecStatementFunc;
                              AIBEBlockProgressFunc : TScriptIBEBlockProgressFunc);
external 'ExecScriptFile@files:IBEScript.dll stdcall';

procedure InitializeWizard;
begin
  DBPage := CreateInputQueryPage(wpReady,
    'DB server params', 'Input DB server params',
    'Please, specify db server params');
  DBPage.Add('Server address:', False);
  DBPage.Add('DB alias:', False);
  DBPage.Values[0] := '127.0.0.1';
  DBPage.Values[1] := 'myalias';
end;

function NextButtonClick(CurPageID: Integer): Boolean;
var hWnd: Integer;
begin
  Result := True;
  if CurPageID = DBPage.ID then begin
    DBServer := DBPage.Values[0];
    DBName := DBPage.Values[1];
    MsgBox('Registering DB ' + DBServer + ':' + DBName + '.', mbInformation, MB_OK);
    ConnectDB(PAnsiChar(AnsiString(
                     'db_name=''' + DBServer + ':' + DBName + '''' +
                     '; user_name=sysdba' +
                     '; password=masterkey' +
                     '; lc_ctype=win1251; sql_dialect=3; clientlib="fbclient.dll"')), @CEH);

  end;
end;


При выполнении функции ConnectDB получаю Runtime error 13:624 и AV.

Вопросс сюда, а не к примеру в дельфийский подфорум потому, что возможно я неверно определил названия импортируемых функций или не вижу какой-то другой специфической именно для ibescript вещи.
...
Рейтинг: 0 / 0
Кто-то пробовал связку InnoSetup + IBEScript?
    #39065583
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonline,

В трейсе, кстати, попытка подключения фиксируется:

Код: sql
1.
2.
3.
4.
5.
6.
2015-09-30T19:13:02.6100 (20906:0xb416fddc) TRACE_INIT
        SESSION_2 installer

2015-09-30T19:13:02.6100 (20906:0xb416fddc) ATTACH_DATABASE
        localtest4 (ATT_160, SYSDBA:NONE, WIN1251, TCPv4:192.168.21.25)
        C:\Users\Devel\AppData\Local\Temp\is-3IF0E.tmp\setup.tmp:3176
...
Рейтинг: 0 / 0
Кто-то пробовал связку InnoSetup + IBEScript?
    #39065723
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonlineВ трейсе, кстати, попытка подключения фиксируется:


Значит, функция вызывается и отрабатывает. А вот что дальше там происходит - ХЗ.
...
Рейтинг: 0 / 0
Кто-то пробовал связку InnoSetup + IBEScript?
    #39065769
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpertЗначит, функция вызывается и отрабатывает. А вот что дальше там происходит - ХЗ.
Подумал точно так же. Кстати, если вместо Connect @files:IBEScript.dll написать что-то другое, инсталлятор не запускается - ругается на отсутствующую функцию. Так что названия функций тоже верные и собака порылась где-то в другом месте.

Выкрутился через IBEScript:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
    ExtractTemporaryFile('fbclient.dll');
    ExtractTemporaryFile('ibescript.exe');
    ExtractTemporaryFile('script.sql');
    ParamString := 'script.sql ' + '-U' + DBUser + ' -P' + DBPass + ' -D' + DBServer + ':' + DBName;
    if not Exec(ExpandConstant('{tmp}') + '\ibescript.exe', ParamString,
      ExpandConstant('{tmp}'), SW_HIDE, ewWaitUntilTerminated, ResultCode)
      then MsgBox('Failed to register client in the db; you should do this later by hands', mbError, MB_OK);


«Неаккуратненько как-то» ©, конечно. Но, учитывая, что операция разовая и решение работает - сойдет.

Хотя если кто напишет как это сделать правильно из dll - было бы здорово.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Кто-то пробовал связку InnoSetup + IBEScript?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]