Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.20;
Скачать: CL | DM;

Вниз

Query.Open из DLL   Найти похожие ветки 

 
andrey111   (2005-01-17 18:16) [0]

Добрый вечер.
Подскажите как правильно передать запросу на форме,
находяшийся в DLL, параметры Database из вызывающей формы.
Проще говоря есть форма с Database. Она вызывает DLL в которых сидят Query, DBGridы и т.д. При Query.Open вылетает окно запроса
пароля на доступ к БД, хотя на вызывающей форме он есть.


 
Desdechado ©   (2005-01-17 19:31) [1]

самый простой, но далеко не самый правильный - передать как параметр указатель на TDatabase, а на него в DLL цеплять все квери
правильнее, конечно, передать необходимые для подключения параметры (взятые из TDatabase), создать в DLL соединение и через него подключать квери - но здесь может стать против логика выполнения запросов (например, часть транзакции выполняется в DLL, чать в вызывающей форме), но это, имхо, вообще изврат

вызывающая форма :)) и ее поведение - хороший каламбур


 
Соловьев ©   (2005-01-17 19:33) [2]

>правильнее, конечно, передать необходимые для подключения
>параметры (взятые из TDatabase), создать в DLL соединение и через
>него подключать квери

Не правильно. Потому как лицензионные сервера имеют ограничения на конекты - поэтому если один коннект занят главной формой, то еще один занимать для длл - непозволительная роскошь.


 
andrey111   (2005-01-18 10:31) [3]

В DLL могу присвоить QUERY имя Database как строку, но тогда
при Open выдается запрос пароля (IB), хотя DataBase открыта - глюк? при вводе пароля все работает.
При передачи указателя Database возникают ошибки доступа к памяти.
Если можно на примере покажите как сделать?


 
Ega23 ©   (2005-01-18 11:02) [4]

Если в ДЛЛ передавать параметры соединения, то это будет ещё один коннект. В общем случае это не есть гуд.
Я бы на твоём месте попробовал передать в DLL объект TDataBase и работать уже с ним. Тогда сохранится общий коннект.


 
Desdechado ©   (2005-01-18 11:15) [5]

2 Соловьев ©
Не надо так категорично.
1. Ограничение на коннекты есть далеко не у всех и не для всех серверов.
2. Не всегда есть гарантия, что основной EXE и DLL откомпилированы в одной версии Delphi с использованием одних исходников. Если это не так, то при передаче указателя будут сплошные AV, ибо в DLL тоже хранится описание используемых классов, но своё. И оно не совпадает с тем, что в ЕХЕ. Следовательно, будет обращаться не по тем адресам. Поэтому для большей надежности я и говорил о передаче параметров подключения.

2 andrey111
в DLL пишем
function doSmth( App: HWND; db: TSQLConnection ): CARDINAL; stdcall;
begin
 Application.Handle := App;
 dbDll := db;
 result := ProcessData();
end;
dbDll - это внутренняя переменная типа TSQLConnection
для БДЕ бери TDatabase


 
Соловьев ©   (2005-01-18 11:44) [6]

2 Desdechado ©
Я не категорично... Просто был горький опыт с MS SQL.
Я у себя передаю ConnectionObject для ADOConnection. Работает отлично.


 
msguns ©   (2005-01-18 11:47) [7]

А откуда берется инфа о БД (параметрах коннекта) в Главной проге ? Если из ini или реестра, то почему бы и dll-ке не брать оттуда же ? Или dll-ка типа универсальная ?


 
andrey111   (2005-01-18 12:27) [8]

--> Desdechado ©

Покажи в моих кусках проги

в Вызывающей проге

procedure TForm1.ButtonClick(Sender: TObject);
var
Proc: procedure (aaa : Tdatabase);
LIBHANDLE: Thandle;
begin
@Proc:=nil;
      LIBHANDLE:=LoadLibrary("DLL1.DLL");
      if NOT(LIBHANDLE=0) then begin
           @Proc:=GetProcAddress(libhandle,"Pril1");
           if @Proc <>nil then Proc(Form1.Database) ;
      end;
FreeLibrary(libhandle);
end;

в DLL

library dll1;

uses
 SysUtils,
 Classes,
 pril1 in "pril1.pas" {FPril1};

//*******************
 PROCEDURE Pril1 ( aaa : Tdatabase);STDCALL;
 BEGIN
 FPril1:=tFPril1.Create(FPril1);
 FPril1.ShowModal;
 FPril1.Free;
 END;
 EXPORTS Pril1;
begin
end.

В Pril1 сидит Query, DATASET, DBGRID И КНОПКА С КОДОМ
qUERY.cLOSE
qUERY.oPEN.


 
mutabor   (2005-01-18 12:39) [9]

а сессию нельзя пеердавать?


 
Desdechado ©   (2005-01-18 13:02) [10]

2 andrey111
ну, и где у тебя присваивание твоему квери переданной aaa: TDatabase?
И для форм лучше делать не Free, а Release (почитай в справке отличие):
with(TPRil1.Create(Application)) do
try
 ShowModal();
finally
 Release;
end;

Кроме того, блок try позволит избежать AV в случае, когда у тебя exception на форме вылезет.


 
andrey111   (2005-01-18 13:38) [11]

В этом и вопрос
Query.Databasename:=aaa.Databasename;
приводит к ошибкам доступа к памяти.
если написать Query.Databasename:="cxvxc";
где cxvxc - aaa.Databasename то выскакивает
окно Database Login для ввода пароля доступа к БД,
и при вводе пароля всё ОК.
но Database в вызывающей форме окрыт - ????
и почему вылетает окно Database Login я не могу понять и
как его убрать ???


 
Соловьев ©   (2005-01-18 13:40) [12]

LoginPromt = false


 
andrey111   (2005-01-18 13:48) [13]

->Соловьев ©   (18.01.05 13:40) [12]
LoginPromt = false

конечно


 
andrey111   (2005-01-18 16:00) [14]

Мастера Delphi  где же Вы ????

2 Соловьев ©
я имел в виду что конечно LoginPromt = false,
но окно Database Login все равно  появляется.

2 Desdechado ©
 Как все таки к Query присвоить  database.


 
Соловьев ©   (2005-01-18 16:13) [15]


...
if @Proc <>nil then Proc(Form1.Database.Handle) ;
...


В dll положить тоже TDatabase и при загрузке формы присваивать

...
DLLDatabase.Handle := AHandle;
...


 
Petr V. Abramov ©   (2005-01-18 22:11) [16]

> Я бы на твоём месте попробовал передать в DLL объект TDataBase
> и работать уже с ним. Тогда сохранится общий коннект.

 Не сохранится. Нужен еще Session (при использовании BDE, при использовании других компонент - фиг еще знает что )

 Гораздо проще скомпилировать exe и dll с runtime-пакетами. Тогда можно передвать что угодно куда угодно.


 
Desdechado ©   (2005-01-19 10:53) [17]

2 Petr V. Abramov ©
Верно. А еще можно вместо DLL сделать BPL. По сути одно и тоже, а по способам доступа к ресурсам друг друга совсем иначе, проще: ограничение 2 из Desdechado © (18.01.05 11:15) [5] снимается.



Страницы: 1 вся ветка

Текущий архив: 2005.02.20;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.032 c
1-1107834997
Аккум
2005-02-08 06:56
2005.02.20
Динамический array of record в памяти как располагается ?


6-1102273603
Biryk
2004-12-05 22:06
2005.02.20
Pomogite razobratca s DLL...


1-1107384287
Green_Templar
2005-02-03 01:44
2005.02.20
добавить в справку


14-1106832227
syte_ser78
2005-01-27 16:23
2005.02.20
Четверговая загадка


6-1099950854
Kot Vaska
2004-11-09 00:54
2005.02.20
Включение при соединении с Инетом