powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Вызов dll-форм из скрипта
63 сообщений из 63, показаны все 3 страниц
Вызов dll-форм из скрипта
    #39967660
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер!

Скажите пожалуйста существует ли технология для передачи управления из скрипта своей dll-форме (если скрипт запущен из Delphi-приложения)?
Скажем для настройки параметров выполнения скрипта пользователем.
Например для выбора директории, значения из списка и/или прочекивания булевых параметров (чек и радио боксы).
Посмотрел демку с Web Forms. Почитал. Понял что эта технология не была доработана и разработчики решили от неё отказаться.

Я представляю себе реализацию таким образом:
Я загружаю модальную форму из dll-файла и передаю в неё основную нить потока выполнения скрипта. Затем, после закрытия формы возвращаю в скрипт массив параметров типа array of const (или просто массив значений типа variant).

На текущий момент, как я понимаю, существует только способ предварительного формирования ini-файла и уже последующий запуск скрипта, который будет парсить этот ini-файл и работать с полученными из него параметрами. Ну может не только так конечно (можно еще параметры предварительно сохранять во временных таблицах или в реестре).

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

Как еще вариант через реестр TRegistry.
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39969191
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что за скрипт-то? IBEBlock??
Есть глобальные переменные, например. В блоке можно их читать и модифицировать.
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39970566
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert,
Да, IBEBlock.

Про глобальные переменные я понял. В принципе думаю можно и ими пользоваться.

Я имел ввиду, например, такую ситуацию или, как модно сейчас говорить - кейс:
Сотрудник запускает скрипт, который должен загрузить множество pdf-файлов счетов, выписок, доверенностей и т.п. В ходе его выполнения нужно указать скрипту директорию из которой будут браться файлы. Затем нужно указать тип документа с которым эти файлы должны быть ассоциированы в БД (тип описан в справочнике БД и по-хорошему нужно выводить лукапкомбобокс). Затем нужно будет отметить какой идентификатор в имени файла следует искать: ИНН или Регистрационный номер. Ну и нужно ли снабжать эти файлы пояснительным комментарием (и если нужно то сам комментарий), который будет пользователям сайта сообщать какую-то важную информацию (например: "оплатить до конца месяца!").

Так вот, на этапе выбора директории уже хотелось бы запустить диалог, типа TOpenDialog и дождаться его завершения.
На стадии выбора типа открыть модальную форму с лукапкомбо со списком доступных типов ну и так далее.

Если действовать через переменные окружения, то наверное можно передавать в запустившую скрипт программу специальные метки.
Через TExecuteScriptProc2 и переданную при запуске в обработчик скрипта CallBack-функцию, например @BlockProgress, отлавливать сообщения и проверять их на наличие этих текстовых спец.меток. И если метка встретилась - запускать связанный с ней диалог, а исполнение самого скрипта пускать по бесконечному циклу, пока ожидаемая переменная окружения не примет значение отличное от дефолтного.

Но тут конечно есть риск подвесить программу.

Можно конечно заранее, перед началом скрипта запускать свой диалог и собирать все настройки, а потом их передавать через переменные окружения. И я пока остановился именно на таком варианте.

Просто когда писал очередной скрипт, подумал, вдруг уже есть какой-то хитрый способ вызывать свои диалоги/модальные формы прямо из скрипта, а я о нём не знаю)

Вот и спросил, чтобы не изобретать велосипед)

Так же, если был бы способ подгружать и открывать модально свои формы(диалоги) из скрипта, то не пришлось бы под каждый скрипт перекомпилировать основную программу. А сделать некоторое количество диалогов: выбор директории/файла, выбор значения из списка, построенного по справочной таблице, открыть текстовый редактор.

P.S.: Ну, знаете, наверное самое близкое что могу привести для примера это TfrxDialogPage в FastReporte. Ведь наверное тоже, можно было бы переменные для построения отчета собирать до его запуска, но это не так удобно, как прямо в самом отчете запускать свою модальную форму и опрашивать пользователя. Да там тоже нет TOpenDialog, но можно через OnUserFunction что угодно вызывать из скрипта отчета и ожидать ответа в потоке самого отчета без костылей типа бесконечного цикла.
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39970711
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стандартные формы для своего приложения ты можешь и должен в своем приложении же и лепить. Я за тебя всякие формочки с комбобоксами лепить не буду, потому что это несерьезно. Сегодня тебе один комбобокс нужен, завтра пять понадобится, послезавтра чекбокс и картинку к ним добавить...

Сейчас почти сделаны три новых коллбэк функции:
1. На SUSPEND в блоке. Будет отдавать значения выходных параметров в формате Json.
2. На запрос входных параметров. Будет дергаться при запуске блока и ожидать значения входных параметров в том же Json.
3. Пользовательский callback - функция типа ibec_Progress, передающая в вызывающее приложение пользовательскую строку и возвращающая другую строку из приложения.
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39970712
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert,

Я себе в идеале вижу такой подход.
У меня в базе хранятся разнообразные скрипты.
Пользователь решая ту или иную задачу вызывает запуск определенного скрипта нажав на какую-то кнопку или пункт меню.
Основная программа подгружает обработчик скриптов(IBEScript.dll), выгружает из базы скрипт и передает управление обработчику.
Обработчик в входе выполнения скрипта видит что требуется установить диалог с пользователем.
Для этого он выгружает из специальной таблицы в БД, тело указанной в скрипте dll-формы на комп пользователя и передает ей управление. Она естественно модальная. В ней пользователь что-то выбирает, отмечает, пишет - в зависимости от контекста задачи. По закрытию результат работы диалога с пользователем сохраняется в переменные окружения. Поток выполнения возвращается дальше в обработчик скрипта. Он читает соответствующие переменные окружения и передает их скрипту.

То есть у нас есть таблица со скриптами IBE$SCRIPTS, где мы храним скрипты IBEBlock.
Допустим будет такая же таблица с dll-формами. Назовем её условно IBE$DLL_FORMS. В её blob-поле IBE$FORM_SOURCE будут храниться тела dll-форм.

Зачем всё это нужно?

- Для гибкости, развития проекта, масштабирования без постоянного перекомпилирования основного Энтерпрайз-приложения, для легкости и прозрачности обновлений.

Мне удобнее большУю часть функционала реализовывать в скрипте (сбор или загрузка каких-то оперативных данных/файлов, для которых не обязательно верстать отчетные формы).
Сохраняя новый скрипт или поправив старый я моментально раскидываю его функционал на 10 разных баз типовых проектов.
В проекте при вызове каждого скрипта, приложение проверяет контрольную сумму и если она отличается грузит новую версию.
Тоже самое и с dll-формами. Тоже самое и с fastReport-отчетами.
Подкорректировать несколько dll-форм, залить их на основной сервер и с него раскидать по проектам проще, чем перекомпилировать основное Энтерпайз-приложение и выкладывать его постоянно в обновления для скачивания. Тем более, зачастую основной функционал отдельного обновления может требоваться только одному сотруднику, а качать его придется сотне.

Вот... ) Такая у меня созрела идея))
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39970713
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert,
Только написал последнее сообщение и увидел ваш ответ!)

авторСтандартные формы для своего приложения ты можешь и должен в своем приложении же и лепить. Я за тебя всякие формочки с комбобоксами лепить не буду, потому что это несерьезно. Сегодня тебе один комбобокс нужен, завтра пять понадобится, послезавтра чекбокс и картинку к ним добавить...

- Что вы! Господь с вами! )) Конечно же мне не нужно чтобы вы написали какие-то диалоговые формы и жестко их зашили в код IBEScript.dll!!

Наоборот )) Я бы хотел иметь возможность из скрипта загружать в память свои dll-формы и передавать им управление.
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39970714
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert

Сейчас почти сделаны три новых коллбэк функции:
1. На SUSPEND в блоке. Будет отдавать значения выходных параметров в формате Json.
2. На запрос входных параметров. Будет дергаться при запуске блока и ожидать значения входных параметров в том же Json.
3. Пользовательский callback - функция типа ibec_Progress, передающая в вызывающее приложение пользовательскую строку и возвращающая другую строку из приложения.


Возможно это как раз то что нужно! )) Только я пока не понимаю в каких вариантах IBEScript.dll будет ожидать ответа от приложения, а в каких нет и будет ли вообще ждать.
Если это что-то типа ibec_Progress, но только с возможностью ожидания ответа хост-приложения, то я думаю разберусь, как всё устроить )))
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39970716
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nofate2009
[Только я пока не понимаю в каких вариантах IBEScript.dll будет ожидать ответа от приложения, а в каких нет и будет ли вообще ждать.


Как с любой другой callback-функцией: пока ты не вернешь результат из своего приложения.
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39970717
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert,
Отлично!)

Тогда это то что нужно!))

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

И когда ожидается релиз, на долго нужно запастись терпением?)


Надеюсь, на выходных в основном сделаю.
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39970719
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
<удалил дубль сообщения>
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39970723
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert


Надеюсь, на выходных в основном сделаю.

Хочу, пользуясь случаем сказать, что с непередаваемым уважением отношусь к вам и вашему делу!
Мне конечно наверное просто не с чем сравнить, так как застрял в технологии Делфи, но хочется сказать, что IBExpert это лучшая админка БД из того что мне доводилось видеть! А IBEScript существенно расширяет возможности работы с данными в стеке Делфи-firebird.
Огромное спасибо за ваш труд!!!
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39970752
AltHasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nofate2009,

+1

Еще спасибо, что бесплатна для нас !

Код: plsql
1.
2.
в About->Лицензия для ex-USSR
IB Expert - The Most Expert for IInterBase and Firebird

задвоенная буква I в слове Interbase
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39971664
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AltHasp

задвоенная буква I в слове Interbase


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

И когда ожидается релиз, на долго нужно запастись терпением?)


Качай свежие версии эксперта и IBEScript.dll
Смотри демку в архиве IBEScript. Думаю, там все понятно.
Все плюшки в новом интерфейсе, старый больше расширяться не будет.

Да, там еще в синтаксисе IBEBlock добавились типа "пространства имен":
Код: plsql
1.
s = @IBEScript.DoUserCallback('something');
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39972505
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert ,
Огромное спасибо!

Буду изучать)
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39972612
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nofate2009

...
Да, там еще в синтаксисе IBEBlock добавились типа "пространства имен":
Код: plsql
1.
s = @IBEScript.DoUserCallback('something');



я посмотрел код примера. И у меня есть подозрение что в нём ошибка.

Чтобы её продемонстрировать нужно поменять в примере код функции DoIBEBlockUserCallback на такой:
Код: 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.
uses 
...,
FileCtrl;
...

function DoIBEBlockUserCallback(ABlockName, AUserData : PAnsiChar): PAnsiChar; stdcall;
var
  s,
  FSelDirName :String;
begin
  Result      := PAnsiChar('<nothing>' + #0);
  FSelDirName := '';

  s := LowerCase(Trim(AUserData));

  if s = '' then
    Result := 'User has passed nothing :(' + #0
  else if s = 'something'
    then Result := PAnsiChar('User has passed following string: ' + s +  #0)
  else if s = 'getdirname' then
    begin

        FSelDirName := ExtractFileDir( Application.ExeName );
        if SelectDirectory(Format('Выберите директорию (BlockName: %s)',
                                                          [ABlockName]),
                                                            '', FSelDirName ) then
            begin

              ShowMessageFmt('User selected directory: "%s"',[FSelDirName]);
              // так происходит повреждение строки:
              Result := PAnsiChar( FSelDirName + #0);
              // так передает строку без повреждения:
              //Result := PAnsiChar( FSelDirName );

            end
              else Result := PAnsiChar(ExtractFileDir(Application.ExeName));

    end
end;



Так же нужно заменить код блока в примере на вкладке "New Interface / callbacks" на такой:
Код: sql
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.
execute ibeblock (
  inInteger1 integer,
  inInteger2 integer)
returns (
  outInt integer,
  outString varchar(1000),
  outBool boolean)
as
begin
  -- Testing IBEBlockProgress callback funtion...
  -- Check the main form caption

  ibec_Progress('Executing IBEBlock...');

  -- Testing IBEBlockGetInputParams callback function...
  -- Value of ii variable should be equal to 444.321
  ii = inInteger1 + inInteger2;
  ibec_ShowMessage(ii);

  -- Testing IBEBlockUserCallback callback function...
  s = @IBEScript.DoUserCallback('getdirname');
  outString[1] = s;
  ibec_ShowMessage(s);


  -- Testing IBEBlockSuspend callback function...
  -- Simple output in JSON format
  outInt = 123;
  outString = 'some string';
  outBool = FALSE;
  suspend;

  -- Testing IBEBlockSuspend callback function...
  -- Output of arrays
  
  outBool[0] = null;
  outBool[1] = TRUE;
  outBool[2] = FALSE;

  suspend;
  ibec_Progress('That''s all, folks!');

end



Теперь откомпилируем, запустим экзешник и запустим пример на вкладке "New Interface / callbacks".

Когда код блока доберется до строчки
Код: sql
1.
s = @IBEScript.DoUserCallback('getdirname');


Нам нужно выбрать, например папку "Log" в директории IBExpert'a и нажать "Ок":


Мы видим что переменная в FSelDirName коде Delphi содержит корректное значение, указывающее на выбранный нами каталог:


Но затем, когда код блока дойдет до инструкции:
Код: sql
1.
ibec_ShowMessage(s);



Мы увидим, что строковый параметр, возвращенный функцией DoIBEBlockUserCallback в исполняемый блок, содержит поврежденное значение строки:


И собственно, тоже самое мы увидим после вывода массива параметров Блока, после выполнения последней инструкции скрипта suspend:


Как это лечить.
Если в коде Делфи, в функции примера DoIBEBlockUserCallback заменить строку:
Код: pascal
1.
Result := PAnsiChar( FSelDirName + #0);


на
Код: pascal
1.
Result := PAnsiChar( FSelDirName );


то проблема решается.
И теперь значение возвращаемого строкового параметра не повреждается:


<приложенный в конце поста файл скрина вторичен. приложил его по ошибке. он и так вставлен в код сообщения как ссылка на скриншот. не нашел как его удалить из этого сообщения >
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39972615
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фигасе ты скриншотов настрогал... Больше так не делай :)
Можно было просто написать, что добавления нуля портит строку. Я, кстати, на это натыкался в DoIBEBlockUserCallback, когда туда пустую строку передавал.
Что-то мне не до конца понятен механизм преобразования строки в PChar... Вроде бы добавление нуля в конец никак не должно ничего портить.
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39972618
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert
Фигасе ты скриншотов настрогал... Больше так не делай :)

Да что-то я и сам подумал об этом по дороге домой. Прошу прощения, увлёкся)
Больше не буду)
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39972619
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
<удалил дубль сообщения. (Постил с телефона)>
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39972649
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Освежил память по дельфевым строкам и PChar... В общем, как я сделал - делать не надо :)
Надо вот так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
var
  sInputs : string;
  sUserBack : string;

function DoIBEBlockUserCallback(ABlockName, AUserData : PAnsiChar) : PAnsiChar; stdcall;
var
  s : string;
begin
  s := AUserData;
  if s = '' then
    sUserBack := 'User has passed nothing :('
  else
    sUserBack := 'User has passed following string: ' + s;
  Result := PAnsiChar(sUserBack);
end;

function DoIBEBlockGetInputParams(ABlockName : PAnsiChar) : PAnsiChar; stdcall;
begin
  sInputs := '{"input" : {"byname" : true, "items" : [{"name" : "inInteger2", "value" : 321}, {"name" : "inInteger1", "value" : [123.321, 123.321]}]}}';
  Result := PAnsiChar(sInputs);
end;



Так данные в глобальных переменных гарантированно будут жить до конца, а в блок не вернется указатель непонятно куда.
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39972667
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert,

Спасибо!)
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #39992963
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
Код: pascal
1.
function DoIBEBlockGetInputParams(ABlockName : PAnsiChar) : PAnsiChar; stdcall;

А что такое ABlockName?
...
Рейтинг: 0 / 0
Вызов 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
Вызов dll-форм из скрипта
    #40000444
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Какой формат входных параметров у ibesConnectionInit?


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

Но нашлись новые баги
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SET NAMES WIN1251;

SET CLIENTLIB 'fbclient.dll';

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

EXECUTE IBEBLOCK
AS
BEGIN
  select 1 from rdb$database into :var;
END;

Код: pascal
1.
2.
ibesScriptExecuteFile(FScripterHandle, 'test.sql', nil);
ibesScriptExecuteFile(FScripterHandle, 'test.sql', nil);

На втором запуске после оператора CONNECT возникает AVAccess violation at address 04F4EC14 in module 'IBEScript.dll'. Read of address 00000050.

Еще наткнулся на такую особенность. Для операторов
Код: sql
1.
2.
SET NAMES WIN1251;
SET CLIENTLIB 'fbclient.dll';

OnBeforeExecStatement вызывается, а OnAfterExecStatement нет. Мне не критично, но может так не задумывалось?
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #40001068
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дальше, есть такая таблица
Код: sql
1.
2.
3.
CREATE TABLE MY_TABLE(
    ID  DM_PK /* DM_PK = INTEGER NOT NULL */
);

пишу такой скрипт
Код: sql
1.
2.
3.
4.
5.
EXECUTE IBEBLOCK
AS
BEGIN
  SELECT t."ID" FROM my_table t rows 1 into :var;
END;

выполняю
Код: pascal
1.
2.
ibesScriptSetConnection(FScripterHandle, FConHandle);
ibesScriptExecuteFile(FScripterHandle, 'test.sql', nil);

получаю ошибкуInvalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, column 10.
"ID".Если убрать кавычки вокруг ID, то все работает. IBExpert такой скрипт выполняет
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #40001085
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Если убрать кавычки вокруг ID, то все работает. IBExpert такой скрипт выполняет
Похоже на игнорирование третьего диалекта. Но в строке подключения он указан

db_name=Server:D:\MyDB.fdb;user_name=SYSDBA;password=masterkey;lc_ctype=WIN1251;clientlib=fbclient.dll;sql_dialect=3
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #40001090
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Похоже на игнорирование третьего диалекта.
Таки да. Если имя параметра изменить с sql_dialect на SqlDialect, то все работает
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #40001094
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще вопрос: такой скрипт

Код: sql
1.
2.
3.
UPDATE OR INSERT INTO MY_TABLE (.....);
..........
UPDATE OR INSERT INTO MY_TABLE (.....);

В IBExpert в заголовке Script Executive я вижу бегущий прогресс
(NNN) Uptating (or inserting into) MY_TABLE...Можно эту строку получать в cbfOnIBEBlockProgress при вызове ibesScriptExecuteFile?
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #40001157
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
В IBExpert в заголовке Script Executive я вижу бегущий прогресс
(NNN) Uptating (or inserting into) MY_TABLE...
Можно эту строку получать в cbfOnIBEBlockProgress при вызове ibesScriptExecuteFile?

Какое отношение это имеет к cbfOn IBEBlock Progress? cbfOnIBEBlockProgress дергается функцией ibec_Progress и только ей.
А лог выполнения скрипта, если он тебе необходим, нужно формировать в OnBeforeExecStatement и OnAfterExecStatement.
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #40001163
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
[На втором запуске после оператора CONNECT возникает AV


Исправил.
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #40001164
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
_Vasilisk_
Похоже на игнорирование третьего диалекта.
Таки да. Если имя параметра изменить с sql_dialect на SqlDialect, то все работает


Исправил.
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #40001264
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
А лог выполнения скрипта, если он тебе необходим, нужно формировать в OnBeforeExecStatement и OnAfterExecStatement.
Я так и думал, что ты так скажешь :)

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

Это так и оставляешь?
_Vasilisk_
Еще наткнулся на такую особенность. Для операторов
Код: sql
1.
2.
SET NAMES WIN1251;
SET CLIENTLIB 'fbclient.dll';


OnBeforeExecStatement вызывается, а OnAfterExecStatement нет. Мне не критично, но может так не задумывалось?
...
Рейтинг: 0 / 0
Вызов dll-форм из скрипта
    #40001350
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
В IBExpert формируется такая красивая строка. А тут придется самому парсить запрос
Не увидел второй параметр в OnBeforeExecuteStatement.

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

Это так и оставляешь?
_Vasilisk_
Еще наткнулся на такую особенность. Для операторов
Код: sql
1.
2.
SET NAMES WIN1251;
SET CLIENTLIB 'fbclient.dll';


OnBeforeExecStatement вызывается, а OnAfterExecStatement нет. Мне не критично, но может так не задумывалось?


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


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