![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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