Форум: "Базы";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];
ВнизКак передать ссылку на комп.IbDatabase,IbQuery в DLL ? Найти похожие ветки
← →
jiny (2006-04-26 10:18) [0]Есть Основной проект и 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-26 11:24) [1]так все-таки ?
← →
Виталий Панасенко (2006-04-26 11:43) [2]Подключение к БД по локальному протоколу ? Если да, то попробуй удаленное, в качестве сервера=LOCALHOST. Так, по крайней мере(вроде бы читал), в документации описано об использовании подключения в DLL. Хотя, все эти заморочки с
> дабы не создавать еще одно подключение к серверу и уж тем
> более к базе
. А что, к БД м.б. только одно подключение?
← →
jiny (2006-04-26 11:53) [3]для Виталий Панасенко (26.04.06 11:43) [2]
Тут в принципе неважно локально или удаленно подключается передаваемая ссылка на БД, т.к. данного вопроса оно , т.е. подключение не касается, хотя бы в виду того, что оно уже состоялось.
> дабы не создавать еще одно подключение к серверу и уж тем
> более к базе
Прога проверяет одно ли подключение осуществлено к БД, если нет то обновление не состоится.
Меня интересует как управлять вышеперечисленными передаваемыми ссылками
← →
Виталий Панасенко (2006-04-26 15:23) [4]
> jiny (26.04.06 11:53) [3]
> для Виталий Панасенко (26.04.06 11:43) [2]
> Тут в принципе неважно локально или удаленно подключается
> передаваемая ссылка на БД, т.к. данного вопроса оно , т.
> е. подключение не касается, хотя бы в виду того, что оно
> уже состоялось.
Если так считаешь, то зачем спрашивать. Я видел своими глазами в документации и на форумах, что при работе с БД НЕОБХОДИМО использовать удаленный варинат подключения.Даже если сервер установлен на этой же машине. Такая необходимость есть при использовании FB/IB в WEB-приложениях (ISAPI/NSAPI). Хотя, может и не в этом проблема.
← →
Desdechado © (2006-04-26 20:47) [5]DLL и проект должны быть скомпилированы в одной версии дельфи
← →
jiny (2006-04-27 09:50) [6]Виталий Панасенко (26.04.06 15:23) [4]
Тут вопрос идет не о подключении . Подключение уже состоялось в основном проекте, мне нужно просто передать ссылку на IBquery в DLL
где DLL уже будет производить всякие манипуляции с компонентом (выборки и т.п)
Desdechado © (26.04.06 20:47) [5]
они скомпилированы именно так.
Так вот это у меня не получается(передача ссылки в DLL)
Еще раз вкратце :
1. Открываю основной проект.
2. при авторизации происходит коннект к БД с соответствующими ролями и проч.
3. При запросе пользователя на обновление справочников вызывается соответствующая DLL, куда я должен передать ссылку на IB компоненты.
4. DLL производит все необходимые манипуляции и закрывается, удаляя за собой все переменные и ссылки на них.
Спасибо заранее
← →
Виталий Панасенко (2006-04-27 10:27) [7]
> Desdechado © (26.04.06 20:47) [5]
> DLL и проект должны быть скомпилированы в одной версии дельфи
Тогда и KERNEL32 нужно так же компилить.:-)))
← →
Desdechado © (2006-04-27 10:39) [8]> DLL производит все необходимые манипуляции и закрывается
> удаляя за собой все переменные и ссылки на них.
т.е. разрушение database и query происходит в DLL ?
раз обращение по адресу 00000, то объекты либо не созданы еще, либо уже разрушены и обнилены
Виталий Панасенко (27.04.06 10:27) [7]
кернел тут ни при чем
дело в том, что в DLL тоже сохраняется описание классов
если оно отличается от того, что в EXE, то AV неминуемо
← →
jiny (2006-04-27 13:48) [9]Виталий Панасенко (27.04.06 10:27) [7]
>>Тогда и KERNEL32 нужно так же компилить.:-)))
Очень умно :) Чувство юмора вам не занимать.
Desdechado © (27.04.06 10:39) [8]
>>т.е. разрушение database и query происходит в DLL
я имел ввиду пер.и ссылки в пределах отдельно взятой DLL
Я даже не представляю что бы было если бы уничтожение происходило в DLL
Я так понял это вопрос в API, хотя вроде как бы и базами связан :(
И почему тогда Админ не перевел мой вопрос в API ?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c