Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBExpert Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Вызов dll-форм из скрипта  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
_Vasilisk_
[/src]
А что такое ABlockName?[/quot]

Имя блока, если он именован:
execute ibeblock MyBlock (...)
as ...
27 авг 20, 17:52    [22188255]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12343
IBExpert
Имя блока, если он именован:
Спасибо
27 авг 20, 19:24    [22188326]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12343
А что возвращает функция ibesConnectionInit?

В этом коде
destructor TIBEScripter.Destroy;
begin
  if FScripterHandle > HINSTANCE_ERROR then
    funcScriptFinalize(FScripterHandle);
  if FDLLHandle > HINSTANCE_ERROR then
    FreeLibrary(FDLLHandle);
  inherited;
end;
нет ли ошибки? Может нужно проверять на
FScripterHandle <> 0
? FDLLHandle точно нужно проверять на <> 0

Сообщение было отредактировано: 3 сен 20, 20:33
3 сен 20, 20:36    [22191761]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12343
А ещё в коллбеках не хватает параметра UserData: Pointer. Тогда можно было бы создавать несколько скриптеров и определять из какого пришел коллбек.

Или в качестве коллбека устанавливать не отдельные функции, а один коллбек-интерфейс.
3 сен 20, 23:05    [22191813]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
_Vasilisk_
А что возвращает функция ibesConnectionInit?


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

_Vasilisk_
нет ли ошибки? Может нужно проверять на
FScripterHandle <> 0
? FDLLHandle точно нужно проверять на <> 0


unsigned 32-bit может оказаться меньше нуля? И меньше HINSTANCE_ERROR тоже не может.

Сообщение было отредактировано: 4 сен 20, 04:06
4 сен 20, 04:10    [22191860]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
_Vasilisk_
А ещё в коллбеках не хватает параметра UserData: Pointer. Тогда можно было бы создавать несколько скриптеров и определять из какого пришел коллбек.


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

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.
4 сен 20, 04:51    [22191861]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12343
IBExpert
sInputs := '{"input" : {"byname" : true, "items" : [{"name" : "inInteger2", "value" : 321},
Как экранировать двойные кавычки в строковом параметре? Про правилам JSON \"? Тогда, я так понимаю, нужно экранировать и сам бэкслэш?
4 сен 20, 14:38    [22192159]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
_Vasilisk_
IBExpert
sInputs := '{"input" : {"byname" : true, "items" : [{"name" : "inInteger2", "value" : 321},
Как экранировать двойные кавычки в строковом параметре? Про правилам JSON \"? Тогда, я так понимаю, нужно экранировать и сам бэкслэш?


Да, по правилам JSON. Бэкслэш - не помню, надо в коде смотреть. Давно попробовал бы.
4 сен 20, 15:02    [22192171]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
IBExpert
Member

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


Вот что в коде у меня:
if (CurChar = '\') and (NextChar in ['\', '/', '"', 'b', 'B', 'f', 'F', 'n', 'N', 'r', 'R', 't', 'T', 'u', 'U']) then
...
4 сен 20, 15:20    [22192180]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12343
Вопрос по обработке ошибок.

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

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

Вызов происходит так
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

Сообщение было отредактировано: 9 сен 20, 12:27
9 сен 20, 12:28    [22194115]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12343
Up?
16 сен 20, 13:00    [22198360]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
_Vasilisk_
Up?


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

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

ЗЫ.:
if FScripterHandle = 0 then
  raise Exception.Create('Error');


В этом, скорее всего, нет смысла: там просто конструктор в ibesScriptInit.
17 сен 20, 04:59    [22198884]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
[quot _Vasilisk_#22194115]

Вот это вот все:
// Old callback functions
ibesScriptSetCallback(FScripterHandle, cbfBeforeExecuteStatement, @DoBeforeExecuteStatement);
ibesScriptSetCallback(FScripterHandle, cbfAfterExecuteStatement, @DoAfterExecuteStatement);
ibesScriptSetCallback(FScripterHandle, cbfOnStatementError, @DoStatementError);


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

ibesScriptExecuteText/ibesScriptExecuteFile сейчас возвращают количество ошибок при выполнении. Соответственно, 0 - если все ОК.
17 сен 20, 06:19    [22198888]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12343
IBExpert
Что такое "обращение к несуществующим объектам"?

EXECUTE IBEBLOCK
AS
BEGIN
  DELETE FROM
    mytable;
END;
Таблицы mytable в базе нет

IBExpert
Проверь в свежей версии.
Стало сильно хуже. При вызове ibesScriptExecuteFile стабильно получаю
Access violation at address 00000000 in module 'Test.exe'. Read of address 00000000.
на любом содержимом скрипта. И даже при отсутствии самого файла скрипта
17 сен 20, 11:22    [22199035]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12343
удалено

Сообщение было отредактировано: 17 сен 20, 19:31
17 сен 20, 19:33    [22199577]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12343
Какой формат входных параметров у ibesConnectionInit?
17 сен 20, 19:49    [22199583]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12343
И еще вопрос: ibesScriptSetConnection я правильно использую?
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.
17 сен 20, 20:03    [22199598]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
_Vasilisk_
Стало сильно хуже. При вызове ibesScriptExecuteFile стабильно получаю


Исправил.
18 сен 20, 05:00    [22199707]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
_Vasilisk_
Какой формат входных параметров у ibesConnectionInit?


Он такой же, как и у старой Connect.
+
    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);
18 сен 20, 05:06    [22199708]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
_Vasilisk_
И еще вопрос: ibesScriptSetConnection я правильно использую?


Нет, конечно. Нужно подсовывать то, что создано функцией ibesConnectionInit.
18 сен 20, 05:08    [22199709]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12343
Скрипт

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!'
18 сен 20, 11:39    [22199835]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12343
В ibesScriptExecuteFile/ibesScriptExecuteText последний параметр AOptions. Что там можно передать?
18 сен 20, 11:42    [22199836]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12343
Скрипт
EXECUTE IBEBLOCK
AS
BEGIN
  select 1 from rdb$database into :var;
END;
Запускаю
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.
18 сен 20, 13:03    [22199921]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
_Vasilisk_
В ibesScriptExecuteFile/ibesScriptExecuteText последний параметр AOptions. Что там можно передать?


Это на будущее, сейчас не используется.
18 сен 20, 15:51    [22200071]     Ответить | Цитировать Сообщить модератору
 Re: Вызов dll-форм из скрипта  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
Вроде все исправил, проверяй.
19 сен 20, 05:34    [22200318]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / IBExpert Ответить