|
xIBEScript.dll 64-bit
|
|||
---|---|---|---|
#18+
IBExpert Ты уверен, что у тебя там одна и та же клиентская либа используется в обоих случаях?? А вот еще: dbname=test.fdb. Ты embedded используешь что-ли? Исходя из вопроса я провел исследование. Ситуация 1: Для скрипта не устанавливаем путь к либе через глобальную переменную. Скрипт автоматом подставляет имя "gds32.dll" с кавычками. В программе на Delphi я перехватываю LoadLibraryExW и уже там меняю путь к либе и имя файла на fbembed.dll. LoadLibraryExW с именем gds32.dll за время работы скрипта вызывается 4 раза. В результате скрипт отрабатывает без ошибок. Ситуация 2: Устанавливаем в глобальную переменную путь к файлу fbembed.dll. LoadLibraryExW при этом вызывается 2 раза, после чего получаем ошибку на RECONNECT. Исходя из исследований ошибка где-то внутри xIBEScript.dll, т.к. результат LoadLibraryExW в обоих случаях возвращается для одной и той же либы. Но в первом случае имя либы внутри скрипта = "gds32.dll", а во втором случае это полностью сформированный путь к fbembed.dll. Т.е. чисто теоретически пользоваться DLL можно, но с костылями. PS: Есть ошибка в ibesScriptFinalize. По документации функция должна возвращать 0, но она возвращает мусор. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2022, 16:23 |
|
xIBEScript.dll 64-bit
|
|||
---|---|---|---|
#18+
oleg_oleinik, 1. Сервер какой версии ты используешь? 2. Как устанавливаешь глобальную переменную при использовании xIBEScript.dll? 3. Что происходит, если прописать полный путь к fbembed.dll прямо в строку коннекта? Вот это у меня работает без проблем: Код: plsql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2022, 05:35 |
|
xIBEScript.dll 64-bit
|
|||
---|---|---|---|
#18+
IBExpert, оказывается можно еще много чего поисследовать)). Однако ваш скрипт с учетом моих изменений путей к либе и к базе тоже вылетает. Вылетает во всех вариациях - устанавливаю ли я путь к либе через глобальную переменную именно в этом скрипте, присваиваю ли я этот путь напрямую в переменную или даже если я указываю его напрямую в строке коннекта. Это ответ на 3-й вопрос. Теперь на первые: 1. Использую Firebird-2.5.9.27139-0_x64_embed.zip . С другими версиями сервера 3.x, 4.x мое приложение не тестировалось и скорее всего переход на них будет не скоро. 2. Для установки глобальной переменной использую следующую функцию Код: pascal 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2022, 10:15 |
|
xIBEScript.dll 64-bit
|
|||
---|---|---|---|
#18+
oleg_oleinik, Скачал клиента по твоей ссылке, упростил блок до предела, выполняю прямо в тестовой демке xIBEScript.dll: ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2022, 11:21 |
|
xIBEScript.dll 64-bit
|
|||
---|---|---|---|
#18+
IBExpert, а у меня тогда что не так? ) Единственно, что приходит на ум - разница между Delphi и FreePascal, но это же все обвязка вокруг DLL. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2022, 14:27 |
|
xIBEScript.dll 64-bit
|
|||
---|---|---|---|
#18+
IBExpert, так как у вас заработало только после того, как я установил правильные параметры connection и дополнительно к connection, который создается в скрите вызвал SetConnection перед вызовом ExecuteScriptText Код: pascal 1. 2. 3. 4. 5. 6. 7.
Если же InitConnection убрать, то получаем ошибку как у меня. Но это не совсем правильно. Насколько я понимаю, вызов ibec_SetConnection должен выполнять те же действия, что и SetConnection в Delphi. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2022, 15:15 |
|
xIBEScript.dll 64-bit
|
|||
---|---|---|---|
#18+
oleg_oleinik IBExpert, а у меня тогда что не так? ) Единственно, что приходит на ум - разница между Delphi и FreePascal, но это же все обвязка вокруг DLL. Ну, есть еще вариант, что мы разные версии xIBEScript мучаем. Собственно, так оно и есть, просто я не помню, чтобы что-то правил по обсуждаемой теме. Но я выложил актуальную (свою) версию, так что попробуй ее. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2022, 05:58 |
|
xIBEScript.dll 64-bit
|
|||
---|---|---|---|
#18+
oleg_oleinik Если же InitConnection убрать, то получаем ошибку как у меня. Но это не совсем правильно. InitConnection - это для скриптов/блоков, в которых не создается собственный коннект. В данном случае он не нужен. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2022, 05:59 |
|
xIBEScript.dll 64-bit
|
|||
---|---|---|---|
#18+
IBExpert, попробовал - чуда не произошло. Запускаю последний тестовый скрипт в DemoApp. Если connection создается и устанавливается в Delphi - то скрипт отрабатывает без ошибок. Если connection с теми же параметрами создается внутри скрипта - Cannot perform operation -- DB is not open. С 32-битной версией xIBEScript те же ошибки, и дополнительно ошибка на скриншоте. PS: Я попробую выполнить тестовый пример на другой машине на windows 10, может что-то в моей windows 11 накрутили. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2022, 07:59 |
|
xIBEScript.dll 64-bit
|
|||
---|---|---|---|
#18+
Ну я бы еще для полноты картины сделал следующее: 1. Проверил скрипт на нормальном коннекте по TCP, чтобы удостовериться, что дело не в embedded. 2. В скрипте, который с reconnect, выполнил что-то, что не закрывает коннект. Чтобы убедиться, что коннект там рабочий. А пока других идей у меня нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2022, 08:44 |
|
xIBEScript.dll 64-bit
|
|||
---|---|---|---|
#18+
IBExpert, при входе в скрипт коннект рабочий, с этим проблем нет. Лог реального скриптаExecuting script update_1_2.sql (Line: 1) : [17.02.2022 10:11:19] Setting connection charset (WIN1251)... Successful (Line: 3) : [17.02.2022 10:11:19] Setting connection sql dialect (3)... Successful (Line: 5) : [17.02.2022 10:11:19] SET... Successful (Line: 10) : [17.02.2022 10:11:19] Altering procedure CHECK_POINT_NAME... Successful (Line: 18) : [17.02.2022 10:11:19] Altering trigger POINTS_BI0... Successful (Line: 23) : [17.02.2022 10:11:19] Altering trigger POINTS_BU0... Successful (Line: 30) : [17.02.2022 10:11:19] Dropping procedure CHECK_POINT_NAME... Successful (Line: 34) : [17.02.2022 10:11:19] Dropping trigger POINTS_BI0... Successful (Line: 35) : [17.02.2022 10:11:19] Dropping trigger POINTS_BU0... Successful Error occurred while executing following statement (line 39): -------- STATEMENT ---------- RECONNECT -------- ERROR ---------- Unsuccessful execution caused by a system error that precludes successful execution of subsequent statements. connection shutdown. ------------------------------------------------------------------------------------------------------------- SQLCODE: -902 SQLSTATE: 08003 GDSCODE: 335544856 (Line: 39) : [17.02.2022 10:11:20] Reconnecting to 'D:\LGGT\Projects\Bases\journals.fdb'... FAILED! Script executed with errors. Total execution time: 1719ms ================================================== А вот куда он дальше девается - непонятно. И да, с моей точки зрения embedded все-таки не виноват ) по двум причинам. 1. я пробовал подключаться этим же скриптом к базе на сервере, через fbclient.dll из дистрибутива сервера - результат тот же. 2. почему-то connection, созданный и установленный из Delphi отрабатывает reconnect нормально, независимо от пути к базе и к либе. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2022, 09:22 |
|
xIBEScript.dll 64-bit
|
|||
---|---|---|---|
#18+
oleg_oleinik, Зачем ты все время дельфи какую-то упоминаешь и логи выполнения каких-то других скриптов выдаешь? Это процесс никак не упрощает, только запутывает. Есть вон простейший блок, на котором твоя проблема у тебя воспроизводится, а у меня - нет. Вот этот блок и надо мучать в тестовой демке. А твоих скриптов у меня нет, и дельфи твоей нет, и что ты там в своем приложении делаешь - я тоже не знаю и воспроизвести не могу. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2022, 09:42 |
|
xIBEScript.dll 64-bit
|
|||
---|---|---|---|
#18+
Меня продолжают терзать смутные сомнения, что xIBEScript.dll у тебя старая. Тестовая демка ищет ее уровнем выше, ты в курсе? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2022, 10:22 |
|
xIBEScript.dll 64-bit
|
|||
---|---|---|---|
#18+
IBExpert, кокретно язык Delphi тут не при чем, я проверил на fpc/Lazarus - тоже самое. Я имел ввиду, что connection должен быть установлен одним из способов либо в скрипте через ibec_UseConnection, либо в вызывающей программе через ibesSetConnection. Одного вызова ibec_CreateConnection в скрипте недостаточно, после этого не работают sql-запросы именно в этом скрипте. Хотя будут работать в том, который вызвать из него если при этом передать созданный connection. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2022, 12:30 |
|
xIBEScript.dll 64-bit
|
|||
---|---|---|---|
#18+
IBExpert, я смог локализовать проблему с reconnect, правда теперь не знаю, что с этим делать. Если я вызываю выполнение скрипта через dll сразу после старта моей программы - все работает нормально. Но если к базе, с которой работает скрипт предварительно создать connection средствами вызывающей программы (на Delphi я использую TIBDatabase), то все нормально работает до вызова reconnect. Причём не работает, даже если я перед вызовом скрипта разорву connection в программе. Т.е. сам connection в скрипте создаётся, остальные операторы ddl отрабатывают, а reconnect - не хочет. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2022, 12:38 |
|
xIBEScript.dll 64-bit
|
|||
---|---|---|---|
#18+
IBExpert, да, конечно я в курсе, где демка ищет xIBEScript.dll. Концепция поменялась, я нашел другую, более простую причину, приводяющую к неработоспособности xIBEScript.dll. Достаточно в программе вызывающей выполнение скрипта через dll предварительно сделать вызов: LoadLibraryExW('ПУТЬ_К_КЛИЕНТСКОЙ_БИБЛИОТЕКЕ', 0, LOAD_WITH_ALTERED_SEARCH_PATH); т.е. ровно то же самое, что делает xIBEScript.dll при создании connection - и все. Изменения в uTestDLL.pas из DemoApp Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9.
Текст скрипта для теста Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Скрипт использует установленный локальный сервер и подключается к существующей или создает новую базу в текущей папке. Если в демке добавить вызов LoadLibraryExW - то reconnect не работает. Но от этого никуда не деться - загрузка клиентской либы выполняется любыми компонентами для работы с Firebird. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2022, 20:16 |
|
xIBEScript.dll 64-bit
|
|||
---|---|---|---|
#18+
oleg_oleinik Достаточно в программе вызывающей выполнение скрипта через dll предварительно сделать вызов: LoadLibraryExW('ПУТЬ_К_КЛИЕНТСКОЙ_БИБЛИОТЕКЕ', 0, LOAD_WITH_ALTERED_SEARCH_PATH); т.е. ровно то же самое, что делает xIBEScript.dll при создании connection - и все. Вооот... Теперь все понятно. 1. Сначала ты у себя в приложении грузишь клиентскую либу, потом то же самое делает xIBEScript. 2. RECONNECT сначала закрывает коннект и выгружает fbemded.dll. 3. Перед выгрузкой fbemded.dll от FB 2.5 выполняется fb_shutdown. 4. После вызова fb_shutdown использовать загруженную в адресное пространство приложения dll (если она там осталась, а это так раз твой случай) уже нельзя, ее нужно выгрузить полностью и загрузить снова. Запретить скриптеру выполнять fb_shutdown можно установкой переменной окружения IBECallFBShutdown в FALSE/0. Но тогда только ты отвечаешь за корректную выгрузку fbemded.dll. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2022, 14:31 |
|
xIBEScript.dll 64-bit
|
|||
---|---|---|---|
#18+
Да, все сказанное относится и к не embedded версии, если это FB 2.5. fb_shutdown в движке эксперта выполняется только для этой версии, проверка делается по версии клиентской библиотеки. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2022, 15:04 |
|
|
start [/forum/topic.php?fid=42&msg=40134741&tid=1598400]: |
0ms |
get settings: |
7ms |
get forum list: |
6ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
37ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
335ms |
get tp. blocked users: |
1ms |
others: | 380ms |
total: | 772ms |
0 / 0 |