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

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

Query.Open из DLL


andrey111 ©   (2005-01-17 18:16:00) 

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


Desdechado   (2005-01-19 10:53:00) [1]

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


Petr V. Abramov   (2005-01-18 22:11:00) [2]

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

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

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


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


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


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

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


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

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

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

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


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

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

конечно


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

LoginPromt = false


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

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


Desdechado   (2005-01-18 13:02:00) [8]

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

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


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

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


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

--> 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.


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

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


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

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


Desdechado   (2005-01-18 11:15:00) [13]

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


Ega23   (2005-01-18 11:02:00) [14]

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


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

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


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

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

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


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

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

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


Наверх

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