Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.48 MB
Время: 0.01 c
2-1149559496
Василий
2006-06-06 06:04
2006.06.25
Прозрачность Textout


2-1149510361
XTD
2006-06-05 16:26
2006.06.25
Invalid floating point operation Исключение класса ElnvalidOp


2-1149774642
Nikolaich
2006-06-08 17:50
2006.06.25
Как программно переместить splitter?


2-1149758283
Tempora
2006-06-08 13:18
2006.06.25
Вопрос по формам


15-1149076149
syte_ser78
2006-05-31 15:49
2006.06.25
Сделать неудаляемой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский