powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Вызов dll-форм из скрипта
25 сообщений из 63, страница 2 из 3
Вызов dll-форм из скрипта
    #39993091
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
[/src]
А что такое ABlockName?[/quot]

Имя блока, если он именован:
execute ibeblock MyBlock (...)
as ...
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39993133
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
Имя блока, если он именован:
Спасибо
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39995373
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что возвращает функция ibesConnectionInit?

В этом коде
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
destructor TIBEScripter.Destroy;
begin
  if FScripterHandle > HINSTANCE_ERROR then
    funcScriptFinalize(FScripterHandle);
  if FDLLHandle > HINSTANCE_ERROR then
    FreeLibrary(FDLLHandle);
  inherited;
end;

нет ли ошибки? Может нужно проверять на
Код: pascal
1.
FScripterHandle <> 0

? FDLLHandle точно нужно проверять на <> 0
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39995409
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ещё в коллбеках не хватает параметра UserData: Pointer. Тогда можно было бы создавать несколько скриптеров и определять из какого пришел коллбек.

Или в качестве коллбека устанавливать не отдельные функции, а один коллбек-интерфейс.
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39995446
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
А что возвращает функция ibesConnectionInit?


Указатель на объект "коннект".

_Vasilisk_
нет ли ошибки? Может нужно проверять на
Код: pascal
1.
FScripterHandle <> 0

? FDLLHandle точно нужно проверять на <> 0


unsigned 32-bit может оказаться меньше нуля? И меньше HINSTANCE_ERROR тоже не может.
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39995447
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
А ещё в коллбеках не хватает параметра UserData: Pointer. Тогда можно было бы создавать несколько скриптеров и определять из какого пришел коллбек.


А сейчас что мешает?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var
  UserData : pointer;

procedure TIBEScripter.ExecuteText(const AScript: string);
begin
  UserData := Self;
  try
    funcScriptExecuteText(FScripterHandle, PAnsiChar(AScript), nil);
  finally
    UserData := nil;
  end;
end;



Это нифига не thread-safe, но и в целом интерфейс IBEScript сейчас в принципе не thread-safe.
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39995672
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
Код: pascal
1.
sInputs := '{"input" : {"byname" : true, "items" : [{"name" : "inInteger2", "value" : 321},

Как экранировать двойные кавычки в строковом параметре? Про правилам JSON \" ? Тогда, я так понимаю, нужно экранировать и сам бэкслэш?
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39995682
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
IBExpert
Код: pascal
1.
sInputs := '{"input" : {"byname" : true, "items" : [{"name" : "inInteger2", "value" : 321},

Как экранировать двойные кавычки в строковом параметре? Про правилам JSON \" ? Тогда, я так понимаю, нужно экранировать и сам бэкслэш?


Да, по правилам JSON. Бэкслэш - не помню, надо в коде смотреть. Давно попробовал бы.
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39995690
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Как экранировать двойные кавычки в строковом параметре? Про правилам JSON \" ? Тогда, я так понимаю, нужно экранировать и сам бэкслэш?


Вот что в коде у меня:
Код: pascal
1.
2.
if (CurChar = '\') and (NextChar in ['\', '/', '"', 'b', 'B', 'f', 'F', 'n', 'N', 'r', 'R', 't', 'T', 'u', 'U']) then
...
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39996873
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос по обработке ошибок.

Есть три кейса:
1. Файл скрипта отсутствует
2. В скрипте находится IBEBLOCK, но он не распарсивается (например пропущена ;)
3. IBEBLOCK корректный с точки зрения синтаксиса, но содержит обращения к несуществующим объектам.

Как эти ошибки отлавливать?

Вызов происходит так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
FScripterHandle := ibesScriptInit();
if FScripterHandle = 0 then
  raise Exception.Create('Error');

// Old callback functions
ibesScriptSetCallback(FScripterHandle, cbfBeforeExecuteStatement, @DoBeforeExecuteStatement);
ibesScriptSetCallback(FScripterHandle, cbfAfterExecuteStatement, @DoAfterExecuteStatement);
ibesScriptSetCallback(FScripterHandle, cbfOnStatementError, @DoStatementError);

// New callback functions
ibesScriptSetCallback(FScripterHandle, cbfOnIBEBlockProgress, @DoIBEBlockProgress);
ibesScriptSetCallback(FScripterHandle, cbfOnIBEBlockSuspend, @DoIBEBlockSuspend);
ibesScriptSetCallback(FScripterHandle, cbfOnIBEBlockUserCallback, @DoIBEBlockUserCallback);
ibesScriptSetCallback(FScripterHandle, cbfOnIBEBlockGetInputParams, @DoIBEBlockGetInputParams);
  
LRes := ibesScriptExecuteText(FScripterHandle,  PAnsiChar(AnsiString(AFileName)), nil);


Во всех случаях (даже при корректном скрипте) LRes = 5583128; DoStatementError не вызывается никогда.

Единственное отличие: при синтаксически корректном скрипте вызывается DoIBEBlockGetInputParams
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39999304
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Up?
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39999612
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Up?


Что-то не заметил я этого сообщения...

Никак сейчас не отловишь, нет там обработки таких ошибок. Надо прикручивать.
Что такое "обращение к несуществующим объектам"?

ЗЫ.:
Код: plsql
1.
2.
if FScripterHandle = 0 then
  raise Exception.Create('Error');



В этом, скорее всего, нет смысла: там просто конструктор в ibesScriptInit.
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39999616
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot _Vasilisk_#22194115]

Вот это вот все:
Код: pascal
1.
2.
3.
4.
// Old callback functions
ibesScriptSetCallback(FScripterHandle, cbfBeforeExecuteStatement, @DoBeforeExecuteStatement);
ibesScriptSetCallback(FScripterHandle, cbfAfterExecuteStatement, @DoAfterExecuteStatement);
ibesScriptSetCallback(FScripterHandle, cbfOnStatementError, @DoStatementError);



вообще не вызывалось, оказывается. Проверь в свежей версии.

ibesScriptExecuteText/ibesScriptExecuteFile сейчас возвращают количество ошибок при выполнении. Соответственно, 0 - если все ОК.
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39999700
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
Что такое "обращение к несуществующим объектам"?

Код: sql
1.
2.
3.
4.
5.
6.
EXECUTE IBEBLOCK
AS
BEGIN
  DELETE FROM
    mytable;
END;

Таблицы mytable в базе нет

IBExpert
Проверь в свежей версии.
Стало сильно хуже. При вызове ibesScriptExecuteFile стабильно получаю Access violation at address 00000000 in module 'Test.exe'. Read of address 00000000.
на любом содержимом скрипта. И даже при отсутствии самого файла скрипта
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #40000014
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
удалено
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #40000019
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой формат входных параметров у ibesConnectionInit?
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #40000026
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще вопрос: ibesScriptSetConnection я правильно использую?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
FScripterHandle := ibesScriptInit();
IBDatabase1.Open;
try
  ibesScriptSetConnection(FScripter, THandle(IBDatabase1.Handle));
  ibesScriptExecuteFile(FScripter, 'script.sql', nil);
finally
  IBDatabase1.Close;
end;

Если да, тогда еще одна бага. При вызове ibesScriptExecuteFile получаю
Access violation at address 0536E989 in module 'IBEScript.dll'. Read of address 00000071.
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #40000112
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Стало сильно хуже. При вызове ibesScriptExecuteFile стабильно получаю


Исправил.
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #40000113
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Какой формат входных параметров у ibesConnectionInit?


Он такой же, как и у старой Connect.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    DB.DBName := ParamsLst.Values['db_name'];
    if ParamsLst.Values['clientlib'] <> '' then
      DB.ClientLibName := ParamsLst.Values['clientlib'];
    DB.DBParams.Add('user_name=' + ParamsLst.Values['user_name']);
    DB.DBParams.Add('password=' + ParamsLst.Values['password']);
    DB.DBParams.Add('lc_ctype=' + ParamsLst.Values['lc_ctype']);
    if ParamsLst.Values['sql_role_name'] <> '' then
      DB.DBParams.Add('sql_role_name=' + ParamsLst.Values['sql_role_name']);
    if ParamsLst.Values['sql_dialect'] <> '' then
      DB.SQLDialect := StrToIntDef(ParamsLst.Values['sql_dialect'], 1);

...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #40000114
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
И еще вопрос: ibesScriptSetConnection я правильно использую?


Нет, конечно. Нужно подсовывать то, что создано функцией ibesConnectionInit.
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #40000194
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скрипт

Код: sql
1.
2.
3.
4.
5.
SET NAMES WIN1251;

SET CLIENTLIB 'fbclient.dll';

CONNECT 'Server:D:\MyDB.fdb' USER 'SYSDBA' PASSWORD 'masterkey';

На последней строке срабатывает OnStatementError с параметрами
AStmtText: 'CONNECT 'Server:D:\MyDB.fdb'' USER ''SYSDBA'' PASSWORD ''masterkey'' '
AErrMessage: 'Database not assigned!'
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #40000195
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В ibesScriptExecuteFile/ibesScriptExecuteText последний параметр AOptions. Что там можно передать?
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #40000239
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скрипт
Код: sql
1.
2.
3.
4.
5.
EXECUTE IBEBLOCK
AS
BEGIN
  select 1 from rdb$database into :var;
END;

Запускаю
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function DoConnectError(AErrorMessage: PAnsiChar): Integer;
begin
  FConnectError := string(AnsiString(AErrorMessage));
  Result := 0;
end;

  FConnectError := '';
  FConHandle := ibesConnectionInit(ConnectionString, DoConnectError);
  if FConnectError <> '' then
    raise EIBEScripterError.Create(FConnectError);
  ibesScriptSetConnection(FScripterHandle, FConHandle);
  ibesScriptExecuteFile(FScripterHandle, 'test.sql', nil);

На SELECT ошибка There is no active connection.
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #40000308
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
В ibesScriptExecuteFile/ibesScriptExecuteText последний параметр AOptions. Что там можно передать?


Это на будущее, сейчас не используется.
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #40000442
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде все исправил, проверяй.
...
Рейтинг: 0 / 0
25 сообщений из 63, страница 2 из 3
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Вызов dll-форм из скрипта
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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