Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Firebird + IBX .. Помогите, plz. [D6, Firebird]


Святослав ©   (2004-10-05 19:23:00) 

Вот такая проблема.
Есть главное приложение, которое работает с плагинами. В нем есть компонент IBDatabase1. Ссылка на него передается в плагин-dll.
Плагины одинаковы, но с разными именами (CANew.dll, ContrAgent.dll).
В них вызывается одинаковый запрос (select * from contragents;)

Так вот, когда вызывем любой плагин, а потом другой – получается Access Violation.
Если несколько раз один и тот же –  Access Violation не происходит.

Раскопки показали, что он происходит при открытии запроса, где в глубине IBDatabase.pas, в районе TIBSchema.

Помогите, пожалуйста!

IBX 6.08 (update) + Firebird 1.0.3.972

-Main app---------------------------------------------------
if (Sender as TIMage).tag = 11 then
      Handlex := LoadLibrary(Pchar('ContrAgent.dll'));

if (Sender as TIMage).tag = 12 then
      Handlex := LoadLibrary(Pchar('CANew.dll'));
if Handlex >= 32 then
 begin
   @IL := nil;
   @IL := GetProcAddress(Handlex, 'Start');
   if @IL <> nil then
   begin
     IL(IBDatabase1,Application,UserID);
   end;
   FreeLibrary(Handlex);
 End;

DLL:--------------------------------------------------------------------

procedure Start(IB : TIBDatabase; App : TApplication; UserID : integer); stdcall;
begin
 FrmPluginMain:=TFrmPluginMain.CreateParented(Application.Handle);
 FrmPluginMain.IBDatabase1:=IB;  
 FrmPluginMain.ShowModal;
 FrmPluginMain.Free;
end;

В форме:

procedure TFrmPluginMain.FormShow(Sender: TObject);
begin
IBQuery1.Database:=IBDatabase1;
IBTransaction1.DefaultDatabase:=IBDatabase1;
IBTransaction1.StartTransaction;
IBQuery1.Open; ///!!!! Вот тут..
end;

procedure TFrmPluginMain.FormHide(Sender: TObject);
begin
IBQuery1.Active:=false;
if IBTransAction1.InTransaction then IBTransAction1.Commit;
end;


jack128   (2004-10-05 22:07:00) [1]

длл - это обязательное условие?? помимо ShareMem есть еще тонкие моменты, которы не обойти. Лудше сразу использовать пакеты.


DrPass   (2004-10-05 21:17:00) [2]

Скорее всего, дальнейшие раскопки покажут, что AV происходит в глубине менеджера памяти по причине отсутствия в секции uses модуля sharemem


Наверх

Титульная страница Поиск, карта сайта Написать письмо