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

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

Как передать ссылку на комп.IbDatabase,IbQuery в DLL ? [D7, IB6.x]


jiny ©   (2006-04-26 10:18:00) 

Есть Основной проект и DLL(которая служит для обновления константных справочников)
так вот, дабы не создавать еще одно подключение к серверу и уж тем более к базе, я в DLL создал 3 переменные, соответственно :
   tmpSprIBDatabase: tibdatabase;
   tmpSprIbQuery: tibquery;
   tmpSprIbTrans: tibtransaction;
хотя можно , в принципе от tmpSprIbTrans откреститься, т.к. ссылка на него есть в  tmpSprIbQuery.Transaction.

В DLL проекте пишу :

procedure ShowConstsrUpdater(xdt: TIbDatabase;xqr: TibQuery;xTrans: TibTransaction);
var form: TFrmUpdater;
begin
 Form := TFrmConstsUpdater.Create(Application);
 form.tmpIBDatabase:=xdt;
 form.tmpIbQuery:=xqr;
 form.tmpIbTrans:=xTrans;
 Form.ShowModal;
 Form.Free;
end;


В основном проекте вызываю все это :

procedure TFrmMain.ActUpdateContsExecute(Sender: TObject);
var
 dllInstance : Thandle;
 ShowConstsUpdater: procedure (xdt: TIbDatabase;xqr: TibQuery;xTrans: TibTransaction);
begin

 dllInstance:=LoadLibrary('sprupdater.dll');
 if DLLInstance = 0 then
 begin
   MessageDlg('Не могу загрузить DLL'+#13+'проверьте наличие файла sprupdater.dll, обновление не выполнено !!!', mtError, [mbOK], 0);
   Exit;
 end;
 @ShowConstsUpdater:=nil;
 @ShowConstsUpdater:=GetProcAddress(DLLInstance,'ShowConstsUpdater');

 if @ShowConstsUpdater <> nil then
         ShowConstsUpdater(dm1.dtbMain,dm1.qrUpdater,dm1.transAdm);

 FreeLibrary(DLLInstance);
end;


В самой форме FrmConstsUpdaterобъявлены переменные в разделе public :

public
   tmpIBDatabase: TIbDatabase;
   tmpIbQuery: TIbQuery;
   tmpIbTrans: TIbTransaction;


в процедуре этой же формы пишу :

tmpIbTrans.StartTransaction

на что мне выдается ошибка :
Access violation at address 00000000. Read of Address 00000000
Честно говоря со ссылками я мало работал и, видимо, это мое упущение...
Что делать ?


jiny   (2006-04-27 13:48:00) [1]

Виталий Панасенко   (27.04.06 10:27) [7]
>>Тогда и KERNEL32 нужно так же компилить.:-)))
Очень умно :) Чувство юмора вам не занимать.

Desdechado ©   (27.04.06 10:39) [8]
>>т.е. разрушение database и query происходит в DLL
я имел ввиду пер.и ссылки в пределах отдельно взятой DLL
Я даже не представляю что бы было если бы уничтожение происходило в DLL

Я так понял это вопрос в API, хотя вроде как бы и базами связан :(
И почему тогда Админ не перевел мой вопрос в API ?


Desdechado   (2006-04-27 10:39:00) [2]

> DLL производит все необходимые манипуляции и закрывается
> удаляя за собой все переменные и ссылки на них.
т.е. разрушение database и query происходит в DLL ?

раз обращение по адресу 00000, то объекты либо не созданы еще, либо уже разрушены и обнилены

Виталий Панасенко   (27.04.06 10:27) [7]
кернел тут ни при чем
дело в том, что в DLL тоже сохраняется описание классов
если оно отличается от того, что в EXE, то AV неминуемо


Виталий Панасенко   (2006-04-27 10:27:00) [3]


> Desdechado ©   (26.04.06 20:47) [5]
> DLL и проект должны быть скомпилированы в одной версии дельфи

Тогда и KERNEL32 нужно так же компилить.:-)))


jiny   (2006-04-27 09:50:00) [4]

Виталий Панасенко   (26.04.06 15:23) [4]
Тут вопрос идет не о подключении . Подключение уже состоялось в основном проекте, мне нужно просто передать ссылку на IBquery в DLL
где DLL уже будет производить всякие манипуляции с компонентом (выборки и т.п)

Desdechado ©   (26.04.06 20:47) [5]
они скомпилированы именно так.

Так вот это у меня не получается(передача ссылки в DLL)

Еще раз вкратце :
1. Открываю основной проект.
2. при авторизации происходит коннект к БД с соответствующими ролями и проч.
3. При запросе пользователя на обновление справочников вызывается соответствующая DLL, куда я должен передать ссылку на IB компоненты.
4. DLL производит все необходимые манипуляции и закрывается, удаляя за собой все переменные и ссылки на них.

Спасибо заранее


Desdechado   (2006-04-26 20:47:00) [5]

DLL и проект должны быть скомпилированы в одной версии дельфи


Виталий Панасенко   (2006-04-26 15:23:00) [6]


> jiny   (26.04.06 11:53) [3]
> для Виталий Панасенко   (26.04.06 11:43) [2]
> Тут в принципе неважно локально или удаленно подключается
> передаваемая ссылка на БД, т.к. данного вопроса оно , т.
> е. подключение не касается, хотя бы в виду того, что  оно
> уже состоялось.

Если так считаешь, то зачем спрашивать. Я видел своими глазами в документации и на форумах, что при работе с БД НЕОБХОДИМО использовать удаленный варинат подключения.Даже если сервер установлен на этой же машине. Такая необходимость есть при использовании FB/IB  в WEB-приложениях (ISAPI/NSAPI). Хотя, может и не в этом проблема.


jiny   (2006-04-26 11:53:00) [7]

для Виталий Панасенко   (26.04.06 11:43) [2]
Тут в принципе неважно локально или удаленно подключается передаваемая ссылка на БД, т.к. данного вопроса оно , т.е. подключение не касается, хотя бы в виду того, что  оно уже состоялось.

> дабы не создавать еще одно подключение к серверу и уж тем
> более к базе
Прога проверяет одно ли подключение осуществлено к БД, если нет то обновление не состоится.
Меня интересует как управлять вышеперечисленными передаваемыми ссылками


Виталий Панасенко   (2006-04-26 11:43:00) [8]

Подключение к БД по локальному протоколу ? Если да, то попробуй удаленное, в качестве сервера=LOCALHOST. Так, по крайней мере(вроде бы читал), в документации описано об использовании подключения в DLL. Хотя, все эти заморочки с
> дабы не создавать еще одно подключение к серверу и уж тем
> более к базе
. А что, к БД м.б. только одно подключение?


jiny   (2006-04-26 11:24:00) [9]

так все-таки ?


Наверх

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