powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как "аккурутно" вызвать fb_shutdown()?
14 сообщений из 14, страница 1 из 1
Как "аккурутно" вызвать fb_shutdown()?
    #38869172
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Приложение использует fb embedded FB 2.5 в качестве клиентской библиотеки для коннекта к УДАЛЕННОМУ серверу FB.

С некоторых пор при завершении приложение зависает не пару секунд, потом подает с AV.

Спасает предварительный (перед завершением приложения) вызов fb_shutdown(), в соответствии с рекомендациями.
~~~~~~~~~~~~

Ну вот. Библиотека fb embedded иногда используется, иногда нет. В зависимости от того, что делает пользователь.
Возможно, что fb embedded вообще никак не используется.

Если в процессе работы не было ни одного коннекта к файлу базы, то вызов fb_shutdown() вызывает падение приложения с AV.

Отследить, был или не был коннект - тяжело: приложение большое, состоит из нескольких слабо связанных между собой dll - модулей, некоторые из модулей используют fb embedded, некоторые - нет.

Вопрос: какие действия следует выполнить, чтобы инициализировать то, что в сообщениях называется "firebird engine instance"?
...или что другое сделать...чтобы fb_shutdown() отработала без AV...


Спасибо.
...
Рейтинг: 0 / 0
Как "аккурутно" вызвать fb_shutdown()?
    #38869176
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
try except не помог что ли?
Или долго шатдаунится?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как "аккурутно" вызвать fb_shutdown()?
    #38869181
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам...
try except не помог что ли?
Или долго шатдаунится?

Да, долго.
И при завершении приложения (после "выгрузки" .pas юнитов, и при выгрузке "статически прилинкованных .dll"), честно говоря, хз что происходит. Вроде весь паскалевский код отработал без проблем, потом моих знаний не хватает.
...
Рейтинг: 0 / 0
Как "аккурутно" вызвать fb_shutdown()?
    #38869248
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДЕсли в процессе работы не было ни одного коннекта к файлу базы, то вызов fb_shutdown() вызывает падение приложения с AV.И это уже в трекере ?
чччДВопрос:...или что другое сделать...чтобы fb_shutdown() отработала без AV...Написать письмо трекеру. Причём срочно, ибо 2.5.4 на носу.
...
Рейтинг: 0 / 0
Как "аккурутно" вызвать fb_shutdown()?
    #38869280
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladчччДЕсли в процессе работы не было ни одного коннекта к файлу базы, то вызов fb_shutdown() вызывает падение приложения с AV.И это уже в трекере ?
чччДВопрос:...или что другое сделать...чтобы fb_shutdown() отработала без AV...Написать письмо трекеру. Причём срочно, ибо 2.5.4 на носу.

Э... я просто не уверен, что AV при вызове fb_shutdown() фактически вслед за LoadLibrary() для кого-то проблема, кроме меня.


Код: 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.
procedure fbifShutdownConnect;
var
  fbClientLibHandle: Cardinal;
  fLibraryName: string;
  fb_shutdown: function(timeout: Cardinal; const reason: Integer): Integer; stdcall;
  fSaved8087CW: Word;
begin
  // Деинициализация коннекта. Метод должен быть вызван перед завершением приложения
  // !!! не в секции finalization
  fSaved8087CW := Get8087CW();
  try
    if Assigned(fbIniImplDataModue) then
      FreeAndNil(fbIniImplDataModue)
    else begin
      fLibraryName := TfbIniImplDataModue.GetFBClientLibName;
      fbClientLibHandle := LoadLibrary(PChar(fLibraryName));
      if fbClientLibHandle > 32 then begin
        fb_shutdown := GetProcAddress(fbClientLibHandle, 'fb_shutdown');
        fb_shutdown(0, 1);
        FreeLibrary(fbClientLibHandle);
      end;
    end;
  finally
    Set8087CW(fSaved8087CW)
  end;
end;



Если при завершении приложения не вызвать подобный код, то fb embedded, загруженная в "статически прилинкованной" dll вызовет AV при завершении приложения.
AV также случается на fb_shutdown(), если приведенный код вызывается, когда не было ни одного коннекта к файлу базы.
...
Сейчас потыркал, и обнаружил, что необязательно коннектиться к файлу, а можно вызвать isc_service_attach/isc_service_detach. Тогда вызов fb_shutdown() тоже не влечет AV.
...

Как все это описать?
...
Рейтинг: 0 / 0
Как "аккурутно" вызвать fb_shutdown()?
    #38869292
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,

дык подключение к сервису - это всё равно подключение
...
Рейтинг: 0 / 0
Как "аккурутно" вызвать fb_shutdown()?
    #38869300
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисчччД,

дык подключение к сервису - это всё равно подключение

Зато не требуется указывать файл базы, и, следовательно он не лочится, что важно в случае, когда fb embedded работает в терминальной сессии: http://www.sql.ru/forum/1139728/firebird-embedded-2-5-v-terminalnoy-sessii-win-2003-sever-2012-server-kak
...
Рейтинг: 0 / 0
Как "аккурутно" вызвать fb_shutdown()?
    #38869360
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аллё, дяденьки.

Ну так как же лучше облачить мои страдания в трекеропригодный вид? Чтобы ничего лишнего...
...
Рейтинг: 0 / 0
Как "аккурутно" вызвать fb_shutdown()?
    #38869368
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДAV также случается на fb_shutdown(), если приведенный код вызывается, когда не было ни одного коннекта к файлу базы.В какой момент вызывается этот код ?

чччДКак все это описать?Небольшое тестовое приложение можешь сделать ?
...
Рейтинг: 0 / 0
Как "аккурутно" вызвать fb_shutdown()?
    #38869370
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,

ну так и напиши вызов fb_shutdown приводит к AV, если не было ни одного коннекта или вызова isc_service_attach

Не волнуйся там тебя поправят если что
...
Рейтинг: 0 / 0
Как "аккурутно" вызвать fb_shutdown()?
    #38869373
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladчччДAV также случается на fb_shutdown(), если приведенный код вызывается, когда не было ни одного коннекта к файлу базы.В какой момент вызывается этот код ?

чччДКак все это описать?Небольшое тестовое приложение можешь сделать ?
Код вызывается перед завершением приложения. После всех дисконнектов (если они были).

Тестовое: Delphi 2007 - пойдет?
...
Рейтинг: 0 / 0
Как "аккурутно" вызвать fb_shutdown()?
    #38869380
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДКод вызывается перед завершением приложенияВ каком месте ты его вызываешь ?
Где, с твоей точки зрения, находится завершение приложения ?

чччДТестовое: Delphi 2007 - пойдет?Наверное. Если там ещё и не будет левых компонент (не из поставки Delphi), то вообще прекрасно.
...
Рейтинг: 0 / 0
Как "аккурутно" вызвать fb_shutdown()?
    #38869641
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД
Код: sql
1.
2.
        fb_shutdown := GetProcAddress(fbClientLibHandle, 'fb_shutdown');
        fb_shutdown(0, 1);

А почему fb_shutdown не проверяется на нулл ?

В общем, я не могу это воспроизвести. Вот как я пробовал:
Код: 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.
program fbShutdown;

{$APPTYPE CONSOLE}

uses
  SysUtils, WIndows;

var
  hDll : THandle;
  buff : array[0..255] of char;
  fShut : function(a, b : cardinal) : Cardinal; stdcall;
  fCVer : procedure(buff : PChar); stdcall;
begin
  hDll := LoadLibrary(PChar(Paramstr(1)));
  if hDll = 0
  then begin
    Writeln(Format('Error loading DLL : %d (%s)', [GetlastError(), SysErrorMessage(GetlastError())]));
    Exit;
  end;

  fCVer := GetProcAddress(hDll, 'isc_get_client_version');
  if Assigned(fCVer)
  then begin
    fCVer(buff);
    Writeln('Client version : ', buff);
  end;

  fShut := GetProcAddress(hDll, 'fb_shutdown');
  if Assigned(fShut)
  then fShut(0, 1);

  FreeLibrary(hDll);
end.

полный путь к тестируемой DLL указывается в ком. строке.
...
Рейтинг: 0 / 0
Как "аккурутно" вызвать fb_shutdown()?
    #38869653
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

я скачал последний билд fb 2.5.4.26831 - баг пропал... еще погоняю, может, чего нарою...
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как "аккурутно" вызвать fb_shutdown()?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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